From 162a21c17ce6b20d8778326152391cd99c2b897b Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Sun, 23 Apr 2023 09:14:05 +0000 Subject: [PATCH 01/31] fix random and create demo --- ppsci/arch/mlp.py | 5 ++- ppsci/constraint/interior_constraint.py | 11 +++--- ppsci/data/dataset/__init__.py | 2 + ppsci/data/dataset/array_dataset.py | 25 +++++++++++++ ppsci/equation/pde/__init__.py | 2 + ppsci/geometry/pointcloud.py | 49 ++++++++++++++++--------- 6 files changed, 70 insertions(+), 24 deletions(-) diff --git a/ppsci/arch/mlp.py b/ppsci/arch/mlp.py index 695fb8261..b394f4c26 100644 --- a/ppsci/arch/mlp.py +++ b/ppsci/arch/mlp.py @@ -102,6 +102,9 @@ def forward_tensor(self, x): def forward(self, x): if self._input_transform is not None: + import copy + + x_old = copy.copy(x) x = self._input_transform(x) y = self.concat_to_tensor(x, self.input_keys, axis=-1) @@ -109,5 +112,5 @@ def forward(self, x): y = self.split_to_dict(y, self.output_keys, axis=-1) if self._output_transform is not None: - y = self._output_transform(y) + y = self._output_transform(y, x_old) return y diff --git a/ppsci/constraint/interior_constraint.py b/ppsci/constraint/interior_constraint.py index f470100d0..2059a70ea 100644 --- a/ppsci/constraint/interior_constraint.py +++ b/ppsci/constraint/interior_constraint.py @@ -16,6 +16,7 @@ from typing import Any from typing import Callable from typing import Dict +from typing import Optional from typing import Union import numpy as np @@ -43,12 +44,12 @@ class InteriorConstraint(base.Constraint): loss (loss.LossBase): Loss functor. random (Literal["pseudo", "LHS"], optional): Random method for sampling data in geometry. Defaults to "pseudo". - criteria (Callable, optional): Criteria for refining specified boundaries. + criteria (Optional[Callable]): Criteria for refining specified boundaries. Defaults to None. evenly (bool, optional): Whether to use evenly distribution sampling. Defaults to False. - weight_dict (Dict[str, Callable], optional): Define the weight of each - constraint variable. Defaults to None. + weight_dict (Optional[Dict[str, Union[Callable, float]]]): Define the + weight of each constraint variable. Defaults to None. name (str, optional): Name of constraint object. Defaults to "EQ". """ @@ -60,9 +61,9 @@ def __init__( dataloader_cfg: Dict[str, Any], loss: loss.LossBase, random: Literal["pseudo", "LHS"] = "pseudo", - criteria: Callable = None, + criteria: Optional[Callable] = None, evenly: bool = False, - weight_dict: Dict[str, Callable] = None, + weight_dict: Optional[Dict[str, Union[Callable, float]]] = None, name: str = "EQ", ): self.label_expr = label_expr diff --git a/ppsci/data/dataset/__init__.py b/ppsci/data/dataset/__init__.py index a7ddee77e..a1243e6ca 100644 --- a/ppsci/data/dataset/__init__.py +++ b/ppsci/data/dataset/__init__.py @@ -14,6 +14,7 @@ import copy from ppsci.data.dataset.array_dataset import IterableNamedArrayDataset +from ppsci.data.dataset.array_dataset import MiniBatchDataset from ppsci.data.dataset.array_dataset import NamedArrayDataset from ppsci.data.dataset.trphysx_dataset import CylinderDataset from ppsci.data.dataset.trphysx_dataset import LorenzDataset @@ -24,6 +25,7 @@ __all__ = [ "IterableNamedArrayDataset", "NamedArrayDataset", + "MiniBatchDataset", "CylinderDataset", "LorenzDataset", "RosslerDataset", diff --git a/ppsci/data/dataset/array_dataset.py b/ppsci/data/dataset/array_dataset.py index 21a3ef312..d3acd9e10 100644 --- a/ppsci/data/dataset/array_dataset.py +++ b/ppsci/data/dataset/array_dataset.py @@ -93,3 +93,28 @@ def __iter__(self): def __len__(self): return 1 + + +class MiniBatchDataset(io.Dataset): + def __init__(self, input, label, weight): + super().__init__() + self.input = input + self.label = label + self.num_samples = self.check_input(input) + + def check_input(self, input): + len_input = set() + for _, value in input.items(): + len_input.add(len(value)) + if len(len_input) is not 1: + raise AttributeError("Input dimension mismatch") + else: + return list(len_input)[0] + + def __getitem__(self, idx): + input_item = {key: value[idx] for key, value in self.input.items()} + label_item = {key: value[idx] for key, value in self.label.items()} + return (input_item, label_item) + + def __len__(self): + return self.num_samples diff --git a/ppsci/equation/pde/__init__.py b/ppsci/equation/pde/__init__.py index bc86342f7..35425a4b9 100644 --- a/ppsci/equation/pde/__init__.py +++ b/ppsci/equation/pde/__init__.py @@ -15,6 +15,7 @@ from ppsci.equation.pde.base import PDE from ppsci.equation.pde.laplace import Laplace from ppsci.equation.pde.navier_stokes import NavierStokes +from ppsci.equation.pde.navier_stokes_ansatz_uvp import NavierStokesAnsatz from ppsci.equation.pde.normal_dot_vec import NormalDotVec __all__ = [ @@ -22,4 +23,5 @@ "Laplace", "NavierStokes", "NormalDotVec", + "NavierStokesAnsatz", ] diff --git a/ppsci/geometry/pointcloud.py b/ppsci/geometry/pointcloud.py index 0453def98..20c5533df 100644 --- a/ppsci/geometry/pointcloud.py +++ b/ppsci/geometry/pointcloud.py @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Dict +from typing import Union + import numpy as np from ppsci.geometry import geometry @@ -22,40 +25,46 @@ class PointCloud(geometry.Geometry): """Class for point cloud geometry, i.e. a set of points from given file or array. Args: - interior_path (str): File which store interior points of a point cloud. + coord_dict (str): File which store interior points of a point cloud. boundary_path (str): File which store boundary points of a point cloud. boundary_normal_path (str): File which store boundary normals of a point cloud. - coord_keys (List[str]): List of coordinate keys, such as ["x", "y"]. + data_key (List[str]): List of coordinate keys, such as ["x", "y"]. alias_dict (List[str]): Alias name for coord key, such as {"X:0": "x", "X:1": "y"}. """ def __init__( self, - interior_path, - coord_keys, + coord_dict: Union[ + str, Dict + ], #  1. 改造PointCloud,在支持从文件读入数据的情况下,同时支持直接使用给定内存中的数据 + extra_data: Dict, # 2. 支持额外信息点 + data_key, boundary_path=None, boundary_normal_path=None, alias_dict=None, ): # Interior points from CSV file - if interior_path.endswith(".csv"): + if str(coord_dict).endswith(".csv"): # read data - data_dict = misc.load_csv_file(interior_path, coord_keys) + data_dict = misc.load_csv_file(coord_dict, data_key) + elif isinstance(coord_dict, dict): + data_dict = coord_dict + data_dict.update(extra_data) - # convert to numpy array - self.interior = [] - for key in coord_keys: - self.interior.append(data_dict[key]) - self.interior = np.concatenate(self.interior, -1) + # convert to numpy array + self.interior = [] + for key in data_key: + self.interior.append(data_dict[key]) + self.interior = np.concatenate(self.interior, -1) # Boundary points from CSV file if boundary_path is not None: # read data - data_dict = misc.load_csv_file(boundary_path, coord_keys) + data_dict = misc.load_csv_file(boundary_path, data_key) # convert to numpy array self.boundary = {} - for key in coord_keys: + for key in data_key: self.boundary.append(data_dict[key]) self.boundary = np.concatenate(self.boundary, -1) else: @@ -64,25 +73,25 @@ def __init__( # Normal of boundary points from CSV file if boundary_normal_path is not None: # read data - data_dict = misc.load_csv_file(boundary_normal_path, coord_keys) + data_dict = misc.load_csv_file(boundary_normal_path, data_key) # convert to numpy array self.normal = {} - for key in coord_keys: + for key in data_key: self.normal.append(data_dict[key]) self.normal = np.concatenate(self.normal, -1) else: self.normal = None self.input_keys = [] - for key in coord_keys: - if key in alias_dict: + for key in data_key: + if alias_dict is not None and key in alias_dict: self.input_keys.append(alias_dict[key]) else: self.input_keys.append(key) super().__init__( - len(coord_keys), + len(data_key), (np.amin(self.interior, axis=0), np.amax(self.interior, axis=0)), np.inf, ) @@ -158,6 +167,10 @@ def random_points(self, n, random="pseudo"): np.random.choice(len(self.interior), size=n, replace=False) ] + def uniform_points(self, n: int, boundary=True): + """Compute the equispaced points in the geometry.""" + return self.interior + def union(self, rhs): raise NotImplementedError( "Union operation for PointCloud is not supported yet." From ca255c65d16e670f036ca94ee0d594797dabc75b Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Thu, 27 Apr 2023 03:47:42 +0000 Subject: [PATCH 02/31] Reproduce Fig. 2.(a) successfully --- examples/pipe/pipe_post.py | 139 ++++++++++++++++++++ examples/pipe/poiseuille_flow_FCNN.py | 105 ++++++++++++--- examples/pipe/poiseuille_flow_analytical.py | 36 ----- ppsci/arch/activation.py | 20 ++- ppsci/solver/printer.py | 2 +- ppsci/solver/solver.py | 2 +- ppsci/solver/train.py | 62 ++++++++- 7 files changed, 306 insertions(+), 60 deletions(-) create mode 100644 examples/pipe/pipe_post.py delete mode 100644 examples/pipe/poiseuille_flow_analytical.py diff --git a/examples/pipe/pipe_post.py b/examples/pipe/pipe_post.py new file mode 100644 index 000000000..455ce3f01 --- /dev/null +++ b/examples/pipe/pipe_post.py @@ -0,0 +1,139 @@ +import os +import pdb + +import matplotlib.pyplot as plt # For plotting +import numpy as np +import pandas as pd +import seaborn as sns +from scipy import stats + +os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/pipe") +data1 = np.load("train_nu.npz") +# data1 = np.load('pipe_test_1dnu.npz') +nu = data1["nu_1d"] +# nu = np.sort(nu) +print("nu is", nu) +############################ +# profile viscosity + +# ss +data = np.load("pred_poiseuille_para_0425.npz") +mesh = data["mesh"] +print("shape of mesh is", mesh.shape) +u = data["u"] +v = data["v"] +p = data["p"] +ut = data["ut"] +uMaxP = data["uMaxP"] +uMaxA = data["uMaxA"] +print("shape of uMaxA", uMaxA.shape) +Ny, Nx, Np = u.shape +print("mesh shape = ", mesh.shape) +print("u shape", u.shape) +idxP = 28 + +# plt.figure() +# plt.contourf(mesh[0,:,:, idxP], mesh[1,:,:,idxP], u[:, :, idxP]) +# plt.axis('equal') +# plt.colorbar() +# plt.savefig('pipe1.png') + +# idxP = np.array([0,28,49]) +idxP = [3] +plot_x = 0.8 +plot_y = 0.07 +fontsize = 16 + +# y = np.linspace(-0.05,0.05,50) +# ii = 0 +# for idxPi in idxP: +# plt.figure() +# for i in range(Nx): +# pP, = plt.plot(y,u[:, i, idxPi]) +# pT, = plt.plot(y,ut[:, i, idxPi], 'r--') +# ii = ii+1 +# plt.close('all') +# plt.legend([pP, pT], ['NN Surrogate,nu = 2.1e-4', 'Truth'],fontsize = fontsize) +# print ('max u = ', np.max(u[:, :, idxP])) +# print ('max ut = ', np.max(ut[:, :, idxP])) +# plt.savefig('pipe2.png') + +# plt.text(0, 0.1, r'$\delta$', +# {'color': 'k', 'fontsize': 24, 'ha': 'center', 'va': 'center', +#'bbox': dict(boxstyle="round", fc="w", ec="k", pad=0.2)}) +d = 0.1 +# plot spanwise u profile along y, looping from nu_small to nu_large +# u = data['u'] +idx_X = int(round(Nx / 2)) +y = np.linspace(-0.05, 0.05, 50) +can = [3, 6, 14, 49] +# for idxP in range(len(nu)): +xtext = [0, 0.5, 1] +ytext = [0.45, 0.28, 0.1, 0.01] +plt.figure(1) +Re = [] +plt.figure(1) +plt.clf() +for idxP in range(len(can)): + # plt.figure(1) + # plt.clf() + print(f"idxP = {idxP}") + ax1 = plt.subplot(111) + (pT,) = plt.plot( + y, ut[:, idx_X, can[idxP]], color="darkblue", linestyle="-", lw=3.0, alpha=1.0 + ) + (pP,) = plt.plot( + y, + u[:, idx_X, can[idxP]], + color="red", + linestyle="--", + dashes=(5, 5), + lw=2.0, + alpha=1.0, + ) + tmpRe = np.max(u[:, idx_X, can[idxP]]) * d / nu[can[idxP]] + Re.append(tmpRe) + # print("Re is",Re) + nu_current = float("{0:.5f}".format(nu[can[idxP]])) + # plt.title(r'$\nu = $' + str(nu_current)) + plt.text( + -0.012, + ytext[idxP], + r"$\nu = $" + str(nu_current), + {"color": "k", "fontsize": 16}, + ) + + +# plt.legend([pT, pP], ['Analytical', 'NN surrogate'], fontsize = 16,loc = 10) +plt.ylabel(r"$u(y)$", fontsize=16) +plt.xlabel(r"$y$", fontsize=16) +ax1.tick_params(axis="x", labelsize=16) +ax1.tick_params(axis="y", labelsize=16) +ax1.set_xlim([-0.05, 0.05]) +ax1.set_ylim([0.0, 0.62]) +figureName = "pipe_uProfiles_nuIdx_.png" +plt.savefig(figureName, bbox_inches="tight") +exit() + +print("Re is", Re) +np.savez("test_Re", Re=Re) +plt.figure(2) +plt.clf() +ax1 = plt.subplot(111) +sns.kdeplot(uMaxA[0, :], shade=True, label="Analytical", linestyle="-", linewidth=3) +sns.kdeplot( + uMaxP[0, :], + shade=False, + label="DNN", + linestyle="--", + linewidth=3.5, + color="darkred", +) +plt.legend(prop={"size": 16}) +plt.xlabel(r"$u_c$", fontsize=16) +plt.ylabel(r"PDF", fontsize=16) +ax1.tick_params(axis="x", labelsize=16) +ax1.tick_params(axis="y", labelsize=16) +figureName = "pipe_unformUQ.png" +plt.savefig(figureName, bbox_inches="tight") +plt.show() diff --git a/examples/pipe/poiseuille_flow_FCNN.py b/examples/pipe/poiseuille_flow_FCNN.py index 1ca430162..3081bc4ba 100644 --- a/examples/pipe/poiseuille_flow_FCNN.py +++ b/examples/pipe/poiseuille_flow_FCNN.py @@ -124,13 +124,14 @@ def momentum_z_compute_func(out): os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/pipe") # set output directory - output_dir = "./output_pipe" - initial_bias_u = np.load("./data/init_net_params/initial_bias_u.npz") - initial_bias_v = np.load("./data/init_net_params/initial_bias_v.npz") - initial_bias_p = np.load("./data/init_net_params/initial_bias_p.npz") - initial_weight_u = np.load("./data/init_net_params/initial_weight_u.npz") - initial_weight_v = np.load("./data/init_net_params/initial_weight_v.npz") - initial_weight_p = np.load("./data/init_net_params/initial_weight_p.npz") + output_dir = "./output_pipe_1" + dir = "/workspace/wangguan/LabelFree-DNN-Surrogate/net_params" + initial_bias_u = np.load(dir + f"/bias_u_epoch_1.npz") + initial_bias_v = np.load(dir + f"/bias_v_epoch_1.npz") + initial_bias_p = np.load(dir + f"/bias_p_epoch_1.npz") + initial_weight_u = np.load(dir + f"/weight_u_epoch_1.npz") + initial_weight_v = np.load(dir + f"/weight_v_epoch_1.npz") + initial_weight_p = np.load(dir + f"/weight_p_epoch_1.npz") from paddle.fluid import core @@ -182,10 +183,13 @@ def momentum_z_compute_func(out): data_1d_nu = np.linspace(nuStart, nuEnd, N_p, endpoint=True) print("train_nu is", data_1d_nu) - + np.savez("train_nu", nu_1d=data_1d_nu) data_2d_xy_before = np.array(np.meshgrid(data_1d_x, data_1d_y, data_1d_nu)) data_2d_xy_before_reshape = data_2d_xy_before.reshape(3, -1) data_2d_xy = data_2d_xy_before_reshape.T + import copy + + data_2d_xy_old = copy.deepcopy(data_2d_xy) np.random.shuffle(data_2d_xy) input_x = data_2d_xy[:, 0].reshape(data_2d_xy.shape[0], 1).astype("float32") @@ -266,7 +270,6 @@ def output_transform(out, input): def input_transform(input): if periodicBC == True: x, y = input["x"], input["y"] - print(x.stop_gradient, y.stop_gradient) nu = input["nu"] b = 2 * np.pi / (X_OUT - X_IN) c = np.pi * (X_IN + X_OUT) / (X_IN - X_OUT) @@ -328,18 +331,80 @@ def input_transform(input): optimizer, epochs=EPOCHS, iters_per_epoch=ITERS_PER_EPOCH, - eval_during_train=True, + eval_during_train=False, + save_freq=10, log_freq=LOG_FREQ, - eval_freq=EVAL_FREQ, equation=equation, - visualizer=visualizer, + checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/pipe/output_pipe/checkpoints/epoch_3000", ) - # train model - solver.train() - - # evaluate after finished training - solver.eval() - - # visualize prediction after finished training - solver.visualize() + def predict( + input_dict, + solver, + ): + for key, val in input_dict.items(): + input_dict[key] = paddle.to_tensor(val, dtype="float32") + evaluator = ppsci.utils.expression.ExpressionSolver( + input_dict.keys(), ["u", "v", "p"], solver.model + ) + output_expr_dict = { + "u": lambda d: d["u"], + "v": lambda d: d["v"], + "p": lambda d: d["p"], + } + for output_key, output_expr in output_expr_dict.items(): + evaluator.add_target_expr(output_expr, output_key) + output_dict = evaluator(input_dict) + return output_dict + + data_2d_xy = data_2d_xy_old + input_dict = { + "x": data_2d_xy[:, 0:1], + "y": data_2d_xy[:, 1:2], + "nu": data_2d_xy[:, 2:3], + } + output_dict = predict(input_dict, solver) + + # analytical solution + N_pTest = 500 + uSolaM = np.zeros([N_y, N_x, N_p]) + dP = P_IN - P_OUT + for i in range(N_p): + uy = (R**2 - data_1d_y**2) * dP / (2 * L * data_1d_nu[i] * RHO) + uSolaM[:, :, i] = np.tile(uy.reshape([N_y, 1]), N_x) + uMax_a = np.zeros([1, N_pTest]) + + data_1d_nuDist = np.random.normal(nuMean, 0.2 * nuMean, N_pTest) + data_2d_xy_before_test = np.array( + np.meshgrid((X_IN - X_OUT) / 2.0, 0, data_1d_nuDist) + ) + data_2d_xy_before_test_reshape = data_2d_xy_before_test.reshape(3, -1) + data_2d_xy_test = data_2d_xy_before_test_reshape.T + data_2d_xy_test = data_2d_xy_before_test_reshape.T + + u_pred_2d_xy = output_dict["u"].numpy() + v_pred_2d_xy = output_dict["v"].numpy() + p_pred_2d_xy = output_dict["p"].numpy() + u_pred_2d_xy_mesh = u_pred_2d_xy.reshape(N_y, N_x, N_p) + v_pred_2d_xy_mesh = v_pred_2d_xy.reshape(N_y, N_x, N_p) + p_pred_2d_xy_mesh = p_pred_2d_xy.reshape(N_y, N_x, N_p) + + input_dict_test = { + "x": data_2d_xy_test[:, 0:1], + "y": data_2d_xy_test[:, 1:2], + "nu": data_2d_xy_test[:, 2:3], + } + output_dict_test = predict(input_dict_test, solver) + + uMax_pred = output_dict_test["u"].numpy() + + np.savez( + "pred_poiseuille_para_0425", + mesh=data_2d_xy_before, + u=u_pred_2d_xy_mesh, + v=v_pred_2d_xy_mesh, + p=p_pred_2d_xy_mesh, + ut=uSolaM, + uMaxP=uMax_pred, + uMaxA=uMax_a, + ) diff --git a/examples/pipe/poiseuille_flow_analytical.py b/examples/pipe/poiseuille_flow_analytical.py deleted file mode 100644 index 6af77f57a..000000000 --- a/examples/pipe/poiseuille_flow_analytical.py +++ /dev/null @@ -1,36 +0,0 @@ -import numpy as np - -if __name__ == "__main__": - R = 0.05 # radius of pipe - RHO = 1 # density - L = 1.0 # length of pipe - nuMean = 0.001 # average viscosity - nuStd = 0.9 - dP = 0.1 - - X_IN = 0 # inlet position of pipe - X_OUT = X_IN + L # outlet position of pipe - - yStart = -R - yEnd = yStart + 2 * R - - nuStart = nuMean - nuMean * nuStd # 0.0001 - nuEnd = nuMean + nuMean * nuStd # 0.1 - - N_x = 10 - N_y = 50 - N_p = 50 - N_pTest = 500 - uSolaM = np.zeros([N_y, N_x, N_p]) - data_1d_x = np.linspace(X_IN, X_OUT, N_x, endpoint=True) - data_1d_y = np.linspace(yStart, yEnd, N_y, endpoint=True) - data_1d_nu = np.linspace(nuStart, nuEnd, N_p, endpoint=True) - data_1d_nuDist = np.random.normal(nuMean, 0.2 * nuMean, N_pTest) - - for i in range(N_p): - uy = (R**2 - data_1d_y**2) * dP / (2 * L * data_1d_nu[i] * RHO) - uSolaM[:, :, i] = np.tile(uy.reshape([N_y, 1]), N_x) - - uMax_a = np.zeros([1, N_pTest]) - for i in range(N_pTest): - uMax_a[0, i] = (R**2) * dP / (2 * L * data_1d_nuDist[i] * RHO) diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index 2e287e024..ea49b4293 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -18,6 +18,24 @@ import paddle.nn as nn import paddle.nn.functional as F + +class Swish(nn.Layer): + def __init__(self, beta: float = 1.0): + super().__init__() + self.beta = paddle.create_parameter( + shape=[1], + dtype="float32", + default_initializer=paddle.nn.initializer.Constant(beta), + ) + + def forward(self, x): + return x * F.sigmoid(x * self.beta) + + +# def swish(x): +# beta = +# return x * F.sigmoid(x * beta) + act_func_dict = { "elu": F.elu, "relu": F.relu, @@ -26,7 +44,7 @@ "silu": F.silu, "sin": paddle.sin, "cos": paddle.cos, - "swish": F.silu, + "swish": Swish(1.0), "tanh": F.tanh, "identity": nn.Identity(), } diff --git a/ppsci/solver/printer.py b/ppsci/solver/printer.py index 5bd383908..d8a8a9d9f 100644 --- a/ppsci/solver/printer.py +++ b/ppsci/solver/printer.py @@ -43,7 +43,7 @@ def log_train_info(trainer, batch_size, epoch_id, iter_id): metric_msg = ", ".join( [ - f"{key}: {trainer.train_output_info[key].avg:.5f}" + f"{key}: {trainer.train_output_info[key].val:.9f}" for key in trainer.train_output_info ] ) diff --git a/ppsci/solver/solver.py b/ppsci/solver/solver.py index 7fc4b4859..a9d174ea5 100644 --- a/ppsci/solver/solver.py +++ b/ppsci/solver/solver.py @@ -303,7 +303,7 @@ def train(self): metric_msg = ", ".join( [self.train_output_info[key].avg_info for key in self.train_output_info] ) - logger.info(f"[Train][Epoch {epoch_id}/{self.epochs}][Avg] {metric_msg}") + # logger.info(f"[Train][Epoch {epoch_id}/{self.epochs}][Avg] {metric_msg}") self.train_output_info.clear() cur_metric = float("inf") diff --git a/ppsci/solver/train.py b/ppsci/solver/train.py index a18b10898..8123d01dc 100644 --- a/ppsci/solver/train.py +++ b/ppsci/solver/train.py @@ -80,7 +80,6 @@ def train_epoch_func(solver, epoch_id, log_freq): if solver.update_freq > 1: total_loss = total_loss / solver.update_freq loss_dict["loss"] = float(total_loss) - # backward if solver.use_amp: total_loss_scaled = solver.scaler.scale(total_loss) @@ -92,6 +91,65 @@ def train_epoch_func(solver, epoch_id, log_freq): solver.lr_scheduler.step() else: total_loss.backward() + # import numpy as np + # dir = "/workspace/wangguan/LabelFree-DNN-Surrogate/net_params" + # bias_u = np.load(dir + f"/bias_u_epoch_{iter_id}.npz") + # bias_v = np.load(dir + f"/bias_v_epoch_{iter_id}.npz") + # bias_p = np.load(dir + f"/bias_p_epoch_{iter_id}.npz") + # weight_u = np.load(dir + f"/weight_u_epoch_{iter_id}.npz") + # weight_v = np.load(dir + f"/weight_v_epoch_{iter_id}.npz") + # weight_p = np.load(dir + f"/weight_p_epoch_{iter_id}.npz") + # weight_grad_u = np.load(dir + f"/weight_grad_u_epoch_{iter_id}.npz") + # weight_grad_v = np.load(dir + f"/weight_grad_v_epoch_{iter_id}.npz") + # weight_grad_p = np.load(dir + f"/weight_grad_p_epoch_{iter_id}.npz") + # # u + # print("w0_u is close:", np.allclose(solver.model.model_list[0].linears[0].weight.numpy(), weight_u[f"w_0"])) + # print("w1_u is close:", np.allclose(solver.model.model_list[0].linears[1].weight.numpy(), weight_u[f"w_1"])) + # print("w2_u is close:", np.allclose(solver.model.model_list[0].linears[2].weight.numpy(), weight_u[f"w_2"])) + # print("w3_u is close:", np.allclose(solver.model.model_list[0].last_fc.weight.numpy(), weight_u[f"w_3"])) + + # print("b0_u is close:", np.allclose(solver.model.model_list[0].linears[0].bias.numpy(), bias_u[f"b_0"])) + # print("b1_u is close:", np.allclose(solver.model.model_list[0].linears[1].bias.numpy(), bias_u[f"b_1"])) + # print("b2_u is close:", np.allclose(solver.model.model_list[0].linears[2].bias.numpy(), bias_u[f"b_2"])) + # print("b3_u is close:", np.allclose(solver.model.model_list[0].last_fc.bias.numpy(), bias_u[f"b_3"])) + + # print("w0_u grad is close:", np.allclose(solver.model.model_list[0].linears[0].weight.grad.numpy(), weight_grad_u[f"w_0"])) + # print("w1_u grad is close:", np.allclose(solver.model.model_list[0].linears[1].weight.grad.numpy(), weight_grad_u[f"w_1"])) + # print("w2_u grad is close:", np.allclose(solver.model.model_list[0].linears[2].weight.grad.numpy(), weight_grad_u[f"w_2"])) + # print("w3_u grad is close:", np.allclose(solver.model.model_list[0].last_fc.weight.grad.numpy(), weight_grad_u[f"w_3"])) + + # #v + # print("w0_v is close:", np.allclose(solver.model.model_list[1].linears[0].weight.numpy(), weight_v[f"w_0"])) + # print("w1_v is close:", np.allclose(solver.model.model_list[1].linears[1].weight.numpy(), weight_v[f"w_1"])) + # print("w2_v is close:", np.allclose(solver.model.model_list[1].linears[2].weight.numpy(), weight_v[f"w_2"])) + # print("w3_v is close:", np.allclose(solver.model.model_list[1].last_fc.weight.numpy(), weight_v[f"w_3"])) + + # print("b0_v is close:", np.allclose(solver.model.model_list[1].linears[0].bias.numpy(), bias_v[f"b_0"])) + # print("b1_v is close:", np.allclose(solver.model.model_list[1].linears[1].bias.numpy(), bias_v[f"b_1"])) + # print("b2_v is close:", np.allclose(solver.model.model_list[1].linears[2].bias.numpy(), bias_v[f"b_2"])) + # print("b3_v is close:", np.allclose(solver.model.model_list[1].last_fc.bias.numpy(), bias_v[f"b_3"])) + + # print("w0_v grad is close:", np.allclose(solver.model.model_list[1].linears[0].weight.grad.numpy(), weight_grad_v[f"w_0"])) + # print("w1_v grad is close:", np.allclose(solver.model.model_list[1].linears[1].weight.grad.numpy(), weight_grad_v[f"w_1"])) + # print("w2_v grad is close:", np.allclose(solver.model.model_list[1].linears[2].weight.grad.numpy(), weight_grad_v[f"w_2"])) + # print("w3_v grad is close:", np.allclose(solver.model.model_list[1].last_fc.weight.grad.numpy(), weight_grad_v[f"w_3"])) + + # #p + # print("w0_p is close:", np.allclose(solver.model.model_list[2].linears[0].weight.numpy(), weight_p[f"w_0"])) + # print("w1_p is close:", np.allclose(solver.model.model_list[2].linears[1].weight.numpy(), weight_p[f"w_1"])) + # print("w2_p is close:", np.allclose(solver.model.model_list[2].linears[2].weight.numpy(), weight_p[f"w_2"])) + # print("w3_p is close:", np.allclose(solver.model.model_list[2].last_fc.weight.numpy(), weight_p[f"w_3"])) + + # print("b0_p is close:", np.allclose(solver.model.model_list[2].linears[0].bias.numpy(), bias_p[f"b_0"])) + # print("b1_p is close:", np.allclose(solver.model.model_list[2].linears[1].bias.numpy(), bias_p[f"b_1"])) + # print("b2_p is close:", np.allclose(solver.model.model_list[2].linears[2].bias.numpy(), bias_p[f"b_2"])) + # print("b3_p is close:", np.allclose(solver.model.model_list[2].last_fc.bias.numpy(), bias_p[f"b_3"])) + + # print("w0_p grad is close:", np.allclose(solver.model.model_list[2].linears[0].weight.grad.numpy(), weight_grad_p[f"w_0"])) + # print("w1_p grad is close:", np.allclose(solver.model.model_list[2].linears[1].weight.grad.numpy(), weight_grad_p[f"w_1"])) + # print("w2_p grad is close:", np.allclose(solver.model.model_list[2].linears[2].weight.grad.numpy(), weight_grad_p[f"w_2"])) + # print("w3_p grad is close:", np.allclose(solver.model.model_list[2].last_fc.weight.grad.numpy(), weight_grad_p[f"w_3"])) + if iter_id % solver.update_freq == 0: solver.optimizer.step() solver.optimizer.clear_grad() @@ -109,6 +167,8 @@ def train_epoch_func(solver, epoch_id, log_freq): if iter_id == 1 or iter_id % log_freq == 0: printer.log_train_info(solver, total_batch_size, epoch_id, iter_id) + # real_loss = float(loss_dict["loss"]) + # print(f"{(epoch_id - 1) * 195 + iter_id} step: loss is {real_loss}") batch_tic = time.perf_counter() From cfc840708043774ca178d5b147315dcb2bb2eded Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Thu, 27 Apr 2023 09:15:51 +0000 Subject: [PATCH 03/31] reproduce fig1 (a) and (b) successfully --- examples/pipe/data/compare/dvdy_epoch_1.npz | Bin 774 -> 0 bytes examples/pipe/data/compare/v_epoch_1.npz | Bin 768 -> 0 bytes examples/pipe/data/compare/y_epoch_1.npz | Bin 1280 -> 0 bytes examples/pipe/data/compare_1/dvdy_epoch_1.npz | Bin 774 -> 0 bytes examples/pipe/data/compare_1/v_epoch_1.npz | Bin 768 -> 0 bytes examples/pipe/data/compare_1/y_epoch_1.npz | Bin 1280 -> 0 bytes examples/pipe/data/compare_2/dvdy_epoch_1.npz | Bin 774 -> 0 bytes examples/pipe/data/compare_2/v_epoch_1.npz | Bin 768 -> 0 bytes examples/pipe/data/compare_2/y_epoch_1.npz | Bin 1280 -> 0 bytes examples/pipe/data/compare_3/dvdy_epoch_1.npz | Bin 774 -> 0 bytes examples/pipe/data/compare_3/v_epoch_1.npz | Bin 25856 -> 0 bytes examples/pipe/data/compare_3/y_epoch_1.npz | Bin 1280 -> 0 bytes examples/pipe/data/compare_4/dvdy_epoch_1.npz | Bin 774 -> 0 bytes examples/pipe/data/compare_4/v_epoch_1.npz | Bin 768 -> 0 bytes examples/pipe/data/compare_4/y_epoch_1.npz | Bin 1280 -> 0 bytes examples/pipe/data/input/input_x_y_nu.npz | Bin 300726 -> 0 bytes .../bias_p_epoch_1.npz} | Bin .../bias_u_epoch_1.npz} | Bin .../bias_v_epoch_1.npz} | Bin .../weight_p_epoch_1.npz} | Bin .../weight_u_epoch_1.npz} | Bin .../weight_v_epoch_1.npz} | Bin .../pipe/output_pipe/checkpoints/latest.pdopt | Bin 138802 -> 139262 bytes .../output_pipe/checkpoints/latest.pdparams | Bin 66915 -> 67170 bytes .../output_pipe/checkpoints/latest.pdstates | Bin 44 -> 45 bytes examples/pipe/pipe_post.py | 11 +++---- examples/pipe/poiseuille_flow_FCNN.py | 27 ++++++++++-------- 27 files changed, 21 insertions(+), 17 deletions(-) delete mode 100644 examples/pipe/data/compare/dvdy_epoch_1.npz delete mode 100644 examples/pipe/data/compare/v_epoch_1.npz delete mode 100644 examples/pipe/data/compare/y_epoch_1.npz delete mode 100644 examples/pipe/data/compare_1/dvdy_epoch_1.npz delete mode 100644 examples/pipe/data/compare_1/v_epoch_1.npz delete mode 100644 examples/pipe/data/compare_1/y_epoch_1.npz delete mode 100644 examples/pipe/data/compare_2/dvdy_epoch_1.npz delete mode 100644 examples/pipe/data/compare_2/v_epoch_1.npz delete mode 100644 examples/pipe/data/compare_2/y_epoch_1.npz delete mode 100644 examples/pipe/data/compare_3/dvdy_epoch_1.npz delete mode 100644 examples/pipe/data/compare_3/v_epoch_1.npz delete mode 100644 examples/pipe/data/compare_3/y_epoch_1.npz delete mode 100644 examples/pipe/data/compare_4/dvdy_epoch_1.npz delete mode 100644 examples/pipe/data/compare_4/v_epoch_1.npz delete mode 100644 examples/pipe/data/compare_4/y_epoch_1.npz delete mode 100644 examples/pipe/data/input/input_x_y_nu.npz rename examples/pipe/data/{init_net_params/initial_bias_p.npz => net_params/bias_p_epoch_1.npz} (100%) rename examples/pipe/data/{init_net_params/initial_bias_u.npz => net_params/bias_u_epoch_1.npz} (100%) rename examples/pipe/data/{init_net_params/initial_bias_v.npz => net_params/bias_v_epoch_1.npz} (100%) rename examples/pipe/data/{init_net_params/initial_weight_p.npz => net_params/weight_p_epoch_1.npz} (100%) rename examples/pipe/data/{init_net_params/initial_weight_u.npz => net_params/weight_u_epoch_1.npz} (100%) rename examples/pipe/data/{init_net_params/initial_weight_v.npz => net_params/weight_v_epoch_1.npz} (100%) diff --git a/examples/pipe/data/compare/dvdy_epoch_1.npz b/examples/pipe/data/compare/dvdy_epoch_1.npz deleted file mode 100644 index d920edea6cc2b60f686175d74e9132ab04dd968e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmbVKZAepL6u$Fgn5C4?@JG;u^s0@-lE}L6v}h|D$?St!f5vPRMcZU6VM*p@1Qmlu zS_~0qETRxZN{a41D=0>-2xeIb6RIDg>4@6M9~;zjm45c8_j2El^PY2_=REH*8nSa# z+}bGPeu}YQ{aG9*|9PB>v-VisJM7(V1-Eh4Ci}^E^0?V_@~H8Yg6rXWd8^HJ#>wwh z^Fmu4uTk@D4(BWk|C9Qm31UON9G zS9{x-mP&ZD;8KnVHDNm)5CSy&rF`G=V2u2@8~+qxE6ov_f&Yby0J}C5C-0FQAp!e) z{PigxH9hc>ds_=#U#g}~?0ZWVNTbz>mGGZJj^YNLxa6&3ZwB(i4}mlGc#frRgjkyC z#6<2p$uyE;?Z=ap_c2bR;8YMl%QCMgNJP%wO(yod!Yp{oTjF*7+Bk5B=X1h$ zPI%epV-X5eEwb&+X~|tEQc3k9+Xe15nH8b&SrIGthuA@24j!6jqwsG?LfD z4v`fO#b^jT#c&auM6Te~{S=jaY!aMLqn>5#?X;S>$P7I_x*4qt23zR8*p5xM+JQ{z)I$ES`TVYke!04 z;}Nv=AWs80%38+o9zUS{EaDdWqQYiy)I*E6&~6-WaSyspK&LXqbf6{)n0ma42|i=s z*fkZDN-sqPAM9HY>qgCf;2RB!ELHZudUvfy<+)!W&wo4FXvkH{X9d39Sf8$T^B
  • y>u?;-0ytnJKyj3`_AXID>rGl zjj@|c{o->m1;@!##c8xcH`k+Y4@FN!^k$vjA~om@ zI=$2xxfls{v~@<>L$d!!@Io{MfAmbSD}?>Ny832=uCCgk>(%||*!*Lsk>XRg(%Z^h z7JD+EY6FD}8c$2A;%7=zoNzzYi@PEd<+ANT7 zmyy=SEi~t~Q4F^BPapF;0+g?_b-UsYhR!xWDFP-*KyvD%> zmh4PI?$_XyTxg`(?J6?8w9t;01N710qYtq6HmK>^bU9lFZq@u?dTz`}>)>|(Z9nS+ zPT@*{eS>``m0_)IE}B^tNdis{Fk4?tvKhoLA@^6{m;Lrq%g8EoL#G3}eilTUMXqtl zN|Y5yD+VY5JzrqwnglX~M;?5ijH>AS`@ys{;HN{L0EL0kk9ti!pJcgG7d-^W$H2&f zV;Hg511VEIa?zrdw%iu!AmYQ&a~!!UPFu+bJqc(wqxK`<{s^^ILCXp_%C%g?dn}{& z0`A?bI7xfJaTv8Q;=X`-5$aZj{RFVjL1!G8H}NK;@Fl@<;f?bNf6bQifgeIZV*cpr-cY&Gj5U4FWcr`F%oy#6~n^XBrGWU zlb}RvOVfTJf+TyWPEZ5|sSko86j5j|JtPHz_|To5`R1*cW_Ry!&zw2){hS>)UJ?ii zHOfU{@=RAgAcXt{MMyNSZOAlRVqP&IljMRN?K`Wh+XI4Hf3K*FM8kIFs<7Q+|L2%9G{5QBf!R0s6^*W5 zeCa;@eE#(8rBrR@I{9_i${&*hE~QV+ zwYv9oGxl9uvEBdPB|S6hZ&mwf$Jobo`QaXZQXf4szThbG%zXac^zhzg9cJI5M>4UU z$Ii)x%O+kCx$^n;v3tP5s1F<(ANEnlO*tMg_-Gt7vnFtHchxOIety@(_umFvxzvv? zJ>E-l)t?!-q0=Iz2aRXm_B)XR1Lr}7m!Kcw)9M`lIuUx&+1h9L>Uun^d_bHvKjX)< z4{ghPH{UUF=>A*zMRoQ|-@yxp4|ryjKZN?g4gSc}^^Kp<6LsNd&!6x6y*F1``($*3 zKZwIe=mCATUIg9+)d%p=@IZe7KYWFb;DLTaUG1~MrSVcq>BHaye}D_T;17I8-@^~| zE$~1`^f~??c*l9VuZ+Lw3!IPsLcd`h=fEfMgucjwjyjKV9`fNId!D6uAru2WDmM9!LethPiZRUNa|tM8A|35tY!rNRh1L##A` zT7#TonqavmhN8r~fl8ok6}C#HgQ=8IajTq|C&onFEIfJKSR|n;D7V69cb#=Av@!)L zNmr!F6eZ=(^G>V7Qtq_bMLx$`=CTXCtJKQa1%IFFFr6k-?N5_c%l;FaG#||P=J!18 z%;dRLzmg<|-Nb*$fO&NuJkic-M|%7?q~SSv*azco7W2YpynMg|^^?8$rC>m3nec)1 zy$|xQFjyKfV|E#hBUAC1HD|`xR6pK1Y6;};^#DWj+|O)FAouoWcx76|<&SPsFvLOX zmPXhi)PCtgMK@x^2>D$@}SBKqXX0#iA@x?H6L=T}5 z2iY@jVvan3=BIvKN%cUnGD@(PMQK+GE;c*hZjL2THyMv*tqzb~VDL<*8nnkOf%G3< z$j_ZdI#@8$yP-@Cn+(83oyd8wcrU9K?*!!+`9EiJQn>?5@Va6w_C~3IY zLEP0WW>nC4E6WnFPW57aau7c|XdG4XT-T_ZZ2ay8S1p6vF48!ZC*=&Mo4Klo9i;86 u7y5RmLZ=`k`a?@g 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 diff --git a/examples/pipe/data/compare_2/y_epoch_1.npz b/examples/pipe/data/compare_2/y_epoch_1.npz deleted file mode 100644 index d6c32225249713342830103b9fb9b4b15d692c3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1280 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 VyDI(9H*(^`S$zHXe_v(te*nao_5uI^ diff --git a/examples/pipe/data/compare_3/y_epoch_1.npz b/examples/pipe/data/compare_3/y_epoch_1.npz deleted file mode 100644 index d6c32225249713342830103b9fb9b4b15d692c3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1280 zcmbVMT}V_x6rP*A67>?bNf6bQifgeIZV*cpr-cY&Gj5U4FWcr`F%oy#6~n^XBrGWU zlb}RvOVfTJf+TyWPEZ5|sSko86j5j|JtPHz_|To5`R1*cW_Ry!&zw2){hS>)UJ?ii zHOfU{@=RAgAcXt{MMyNSZOAlRVqP&IljMRN?K`Wh+XI4Hf3K*FM8kIFs<7Q+|L2%9G{5QBf!R0s6^*W5 zeCa;@eE#(8rBrR@I{9_i${&*hE~QV+ zwYv9oGxl9uvEBdPB|S6hZ&mwf$Jobo`QaXZQXf4szThbG%zXac^zhzg9cJI5M>4UU z$Ii)x%O+kCx$^n;v3tP5s1F<(ANEnlO*tMg_-Gt7vnFtHchxOIety@(_umFvxzvv? zJ>E-l)t?!-q0=Iz2aRXm_B)XR1Lr}7m!Kcw)9M`lIuUx&+1h9L>Uun^d_bHvKjX)< z4{ghPH{UUF=>A*zMRoQ|-@yxp4|ryjKZN?g4gSc}^^Kp<6LsNd&!6x6y*F1``($*3 zKZwIe=mCATUIg9+)d%p=@IZe7KYWFb;DLTaUG1~MrSVcq>BHaye}D_T;17I8-@^~| zE$~1`^f~??c*l9VuZ+Lw3!IPsLcd`h=fEfMgucjwjyjKV9`fNId-2xeIb6RIDg>4@6M9~;zjm45c8_j2El^PY2_=REH*8nSa# z+}bGPeu}YQ{aG9*|9PB>v-VisJM7(V1-Eh4Ci}^E^0?V_@~H8Yg6rXWd8^HJ#>wwh z^Fmu4uTk@D4(BWk|C9Qm31UON9G zS9{x-mP&ZD;8KnVHDNm)5CSy&rF`G=V2u2@8~+qxE6ov_f&Yby0J}C5C-0FQAp!e) z{PigxH9hc>ds_=#U#g}~?0ZWVNTbz>mGGZJj^YNLxa6&3ZwB(i4}mlGc#frRgjkyC z#6<2p$uyE;?Z=ap_c2bR;8YMl%QCMgNJP%wO(yod!Yp{oTjF*7+Bk5B=X1h$ zPI%epV-X5eEwb&+X~|tEQc3k9+Xe15nH8b&SrIGthuA@24j!6jqwsG?LfD z4v`fO#b^jT#c&auM6Te~{S=jaY!aMLqn>5#?X;S>$P7I_x*4qt23zR8*p5xM+JQ{z)I$ES`TVYke!04 z;}Nv=AWs80%38+o9zUS{EaDdWqQYiy)I*E6&~6-WaSyspK&LXqbf6{)n0ma42|i=s z*fkZDN-sqPAM9HY>qgCf;2RB!ELHZudUvfy<+)!W&wo4FXvkH{X9d39Sf8$T^B
  • y>u?;-0ytnJKyj3`_AXID>rGl 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%0DgdXKx>^wWY{eU)!tjGp7w zEYPEGIMBf-e$Yshcz7_x;ooei?F_bjb7>Y}+xOt_JilP@vEItF#!a92!t?qnUk}Zj zSm)*r4}5umvp91uP9J!LvweBA=!-qGf(LEtIO8Fn_SEM~{Zk7DOfv?@8IO3bzJ9n% zaQL8qG^*pVXXf%$E?qR(SKDmjLtl4Jj9%KKrFnzzj;Re(yj(uwV6Q&WLqj+;>Jf}{ zrg+zH6Ko#9gTrT--aOR#mW-{ix+e{_ojpQ{bqMJdC5Dz(7^|5yzs$aE&Zk| zf7QT|E@!aS_gkZ;d2(O$1~(eg4xjJ*!V8XBR}&AIdZHE_cxuBolQixY_r<&}6f#o%Rj#OQ$>=l19p!;}1m zN1xuxbR(tTf%Vt76d_B{1^QS*@cwvtRxX|rR!W1vh?DElXuvz1| z-pi+f=f2f~AqSo{|8Vr+mB(V#uoh>&`Rt(^jvOd04%Z}#xRRlYSH@L{NJUwk~xjC$Vc!SlBE?af16 z^_+HVeas{McMji!pLye}GqHL`13#VP$-nxg7LMZhNO!;Ow3#p1F!?~E`uNy~Ywqw+ zPmX-r^@?tNt=Hh@j@kAaBF*wnQzuLa}#4oeZT;Qm_9?++j@8%nhSdTfu z%Z%`eM>yzF^T#`Va2K3=aDy$!qXw?dcxi18%>piB%^GZ6;o0x5(xhk3y~V4qrds?^ z2Zp<*jvD+ncjEXSNBC-+37E9=5GTItA$(r*9hO)=(C!UOzdU9|AJl-&6TRzqk`{Y< z%~$;Rinn+^<8J;v;^@R@@g|lp@l~4#YVea!W<(7AdQJyVXwhF!=W6J)JRESNQ!RV6 z$Q926d-|sj>e2~c9^Ux!5nrBrs|UwgkMb3cI&n~+CwazO-}K<%QI95C^i5CUx$nGy zg@+uz@!h#t9B8oSm44AG#*k7=y9elesuGsZ*|n@w}&6<;Lj^s^uQy}nf|K_ z3pZyxP|s}2G4~$dX3Sd+-kLLyeYNw3M!eO*SKoMGAGVrwt7k0+M{BdhH~RAgPx$J< zr5Uz8ebXCn`#d${{WikKmw!0GmFrEb{+ki~f@5~oGo$*zM|pVBtj~BhhkWBb4SbZN zPsPZ$PYWJus|QODVZYyF@$m8FE6x4eMo(xFg9~2yK!ZBY zXf}t=J@D1R-M+P6i-*StZ}q(O%o|r6CVdJD09nL&3>y=s_c>Kcyo_Ugs2W|YtPo6a{aQOf;Z~3IQ zb8)!%U7)r4&S~H|?PlFuJ$m@3zw-HICTYRVJn&D?U;lo8^!(xZ?fZW(Zl7O0`}fyR z_nYU*wd?ia?*D(ieDn7Gk12nD{O7lyr~EM>?|+u^_0Rj4Ql0|7{`+wM_RGWV&Aab8 TPxk2H_Hg?;=TE;pp8x*`oR{q} diff --git a/examples/pipe/data/init_net_params/initial_bias_p.npz b/examples/pipe/data/net_params/bias_p_epoch_1.npz similarity index 100% rename from examples/pipe/data/init_net_params/initial_bias_p.npz rename to examples/pipe/data/net_params/bias_p_epoch_1.npz diff --git a/examples/pipe/data/init_net_params/initial_bias_u.npz b/examples/pipe/data/net_params/bias_u_epoch_1.npz similarity index 100% rename from examples/pipe/data/init_net_params/initial_bias_u.npz rename to examples/pipe/data/net_params/bias_u_epoch_1.npz diff --git a/examples/pipe/data/init_net_params/initial_bias_v.npz b/examples/pipe/data/net_params/bias_v_epoch_1.npz similarity index 100% rename from examples/pipe/data/init_net_params/initial_bias_v.npz rename to examples/pipe/data/net_params/bias_v_epoch_1.npz diff --git a/examples/pipe/data/init_net_params/initial_weight_p.npz b/examples/pipe/data/net_params/weight_p_epoch_1.npz similarity index 100% rename from examples/pipe/data/init_net_params/initial_weight_p.npz rename to examples/pipe/data/net_params/weight_p_epoch_1.npz diff --git a/examples/pipe/data/init_net_params/initial_weight_u.npz b/examples/pipe/data/net_params/weight_u_epoch_1.npz similarity index 100% rename from examples/pipe/data/init_net_params/initial_weight_u.npz rename to examples/pipe/data/net_params/weight_u_epoch_1.npz diff --git a/examples/pipe/data/init_net_params/initial_weight_v.npz b/examples/pipe/data/net_params/weight_v_epoch_1.npz similarity index 100% rename from examples/pipe/data/init_net_params/initial_weight_v.npz rename to examples/pipe/data/net_params/weight_v_epoch_1.npz diff --git a/examples/pipe/output_pipe/checkpoints/latest.pdopt b/examples/pipe/output_pipe/checkpoints/latest.pdopt index 7d6d66f6ea49a2f097123e0d70388f8bc62592f2..25768ce8b5e943d342c551f59b0a09dfe503fc9c 100644 GIT binary patch literal 139262 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 ~M zSPdR7KO82^TPJxQMefEENFkn@FbQR5w%{+{myjO;vuVk*?e$zJEG3y0NnLdOR3xLRI7~^jfgQ@ARWWjpDNpea8 zv}wL~Li}o~Diq}ygR$i)-ekUmxF=vCEPgl%>*e}Db%72ZuzQWqnqFan6UPzt{s^&& zB*9OqY6A@al}s+~^`jRCN%prX_1GrnHXR2T&zDulbC0iufTfkhF|~kv*{z2^IIhB~ z5+qyT-gq4KM1g#09z?gDP=<>)Y{6i344#=g9!w&3asP@EnY9nX)`N$E@fCj(urV9{ zvRrikv<}oioWwSSzGeJ~4WO+Is4lx!G+^5ifV;$}Bq@^3MPgpybAAVR^ ztQUt{JAC2HuTyx7nJYljXjXD*u#j``V2)*#!tNa=iK-*0J7-|S-tVlb?-{#m;SPBjX&@CRNq*f_0~hONuutzy(fZGJxL@-7 z$tzbullclfc*-fhtFoT_H!t1)o=j-dztUvn5tHJE-V>(ZjBga5&%7zzy=r!G5Z+pH z`Spm>miUz7TD4B$(Ec}&>7h`%c=QI7-XHSjGCBuMdPb+1j6JO&T$9h6ece@NQhO=8 zSn2USle-ZS#VhwZm6)dp%)Eo*O2lv9n#roJGrfKIs>xF@S^jjrOZuYJWE5BZk3u3Rsy{2gGj z#H`R{^xfX#7#eR<;Bk))+VJ~7W9%*e7iPl$BF}0a94O0Ap~VmVPn1aQA1GTjy+wRK zV4#e9^`Rv1(Sp)MV^-{OXrOHV4MUU4#T!b7Nv;>4b|_1i+-JHhthh_^`beOB+3j)p zB`;!q!Rx?4*>%bNeS(=KwxX8O!*}ybBKl3shO`_uJwLgqxclnlQW)YQ*6w~t#_t{| z+cW59F>LQLxj)*sxNz4%S&L&_sa3(|(oA>dlA{+2id!U~pOt#fWN5cW$u-Hf#Yzv; zE#|9>y_!@@PM?}#@>KHPsd1106TNHszp#`37kM`5+2Kk5@%NeXKYn}v9~%3A5v~94 zUBGP};p#klaqy7__DcfU-YhF6>{Z##Op*=7y$$!6!pkIy<*=6IY#1RtdG!eUeM4KE z)Fv-Xv)DwsFXfU0H`lPft}((x3nvis)K_pTshd68S3z3e9>${-5J}VMByXY|xV0ND zlf;cf#5>Pekx_GQv5ba7R`@xFZD=ed&Nec_w!ub1{o-XzEh&|;mShr|Hd5GGtVTv9 zJ?2%^&DnKJA^3fiNFgys%sxMmj1nu35v2S56ybx_$Ys z;@YieO~&S>m_(lVB7S&dT*(~0&j0jzTm6rl%YQ&)r$HT(_Em!kLspPKRKVgb?AVF$ zdK`aTo)b7cppVXLk+~bgIG@f)a8uX{Rd?1iP0+#$rpBmmwF_48PGPw&m#{zrwGuVv z!R=wjcy`nl=8-zAd;#Ar2Bf#xuPmhv8vt zC@K0kg!#~Lr0=w!dgNN-_uh`|=Fx6s5$9XPu0~>;=laawYZEBkE`wz`25jjwLmXT4 z4azfYu*#k!7v;j4MRfVOZ!*xD>e>Pkm*I9crc7@0ZEsmDEJq zrKv$Qn&QcCUq$kJixd$B9>wsg3|1;HV18X9nAvrj=$LWr)x11pw>X!+O83S--w!hJ za#d`d>?u0@jN)Mj3ScE? zY{;t67364JD;N&h#NYGoN3R=3UVp<^EF8B)}KVN}naX3UbZks|tqyjlJXcers_>LFONauwzx3~wXMzC`EP%Ns}!hfRksmHn=qh&5fx$#rp z(cGc?MCq1Z=!d2yQUZdX#7k4pyZc0=woRn38dl&=-vm0RB}{Tw6oF0{H1TNzjl6PY z4AQ=B37X@SIDEW@K5^#Y%9MPn`|dam@tZ{d40A?1tq0J>-45vNf`#yx_%BVoZLR3Md%a>GBMAxc^_RqZ@FHlR%3D`lc7 z1^3Y^H9eU0YX?!Vv|_4v7qQjX@8jg(y4>O0uj!;Z1EP02j$7!Q0x6DxFf?&LOB!o{ z`$MOp)zWM6`{^gxmcmz z#SQW8n9n_gH!V(wbF)m?fw4*O>tsCHl&Hq8_$HvI7bECtaKtP2yR)UN54kVQD>@#M zg8z*$V0W{ao?3moMRi+I;lSCYvg}eT_%vl)~WdCMYO% z!V&k+3g)j{NAu%zag3)dw|SHzd<^QNmpnhi4~s0cBk&3*cjysH)EdpwrRQKNiHHSM^-;zEFL{J`FkX&gqc)Z$yvfP`C^7@r<`*#W<0bl5^71N;cm>9~}6`^3~ z5V-xJ2{}oxfsb}F__TsEoKR0C?|!dmD$hdM!$c{v@4{X#AVn4OpUo#Dnt= z+0ZcYICG13#72{Y(J_x$Jmt+b_WisRAr39jIj0R`U3~D}-_!6YNm5Dd)8k~>Q30J` zKZcyUmqwod&?J@r2 zXCv|HQRSkbxU=|%-72=MKNE`g_X2vnmYJ?thTSy{S(R)U{%fMjTBfEK4eNYtAY>n3l(w&>|xW>v2!e`cpZ`_?7V z57AJrbwZ-(X(`9OTRM?@kSWC-qo<5B2A>dl>WKIohRX#pJN$TeX;hmJnWtWKyS8a#V#7MYN zBa1(7+9L?^7(s`PUxJ0d$^_pRRnhtFdDJ!H1b8MaL`m~QIg98-G_?2*U=v?u|OFd6HnrGx6OGX(8u}OSy)?d6dqcuh!Z;U(Eb^Xbj`q8kk`CK zm!GJ>R%@oi*)B2HR$k5z4hlh|4#z^boi1Aa_hixLLDfk4#|GGU?gSm>*-wSTw}SB> zFBEu}gMWu2QNl}2=#bdB?>rBI%)okLAfL|sTPdSDLZaN`#<^)ug{+UY*CK6*A(wQAVWAUzyd+Rb{6mQ*cDM4>sLt!sH&^CQIfV zq8E=XBDHdj%qvq>4^%@kUWih4AK;I-k5w3)^BDJZ0x!%%&947{l}YjNv_W zQ;R;)-@gdH_nYBAODExdO&93Hafd71)fTa>0A#UImO!b=q*E6h$&5s%= zd@&WNc$v}fjWT#vk0Lu@c>-y?3NBhV-WLCu^af<689-NQ5X@uweFah^p{{{Ap_Fn@k3N z$P2ew#ge?QhsdCLYUJWUQx*}`#IU?EYy3Q3cwDB4CCBLDhb4M&#H0sDs{CT<-be6c z?_LofC?M0O-DdA{Rai-+7gM!vW{Wr7z>0!QiFWlByK6+SOx+VSKlLMOY_(vC9~H=8 z#j#{hUmmHGI&)H8`-$2G8!BMqJnYp^J>AXwX&!VX?c(!u7{t ziNj$mJv?bZ`XFV*iwq(Qe%As@D8L&09fn}H1H7L0+OOp4Dbs3K2?HT1>8e7ra{P%`_L1T)3TI4d?-aLafc9kF>G9(})7 za82Vn{anuI^T8A!L&c|>|a?N2K8>N!*BbYU~<+aPQSR8e|SCy zZH`KXT@}X2XKQXzOK}s*+T#apew2Egm4#it{%}TjH!?Pu0&ONqC}z)CFeq!FZ`WyJ z6I(Bqx($)a2zxTDz8;#s8S^tk+R@2+ZHE6I;+?ai@H&_6Sa!)~Qo2eD9(=T-yN54= z<$3-D?8N)f7P|=@x!|b}Mt~ABv&{A0TnmT2?I64ZmOAgqh9T zp!(MlJaMN18S*<4Yd3|lDTQ)m>!dLH)$S0|be;x!ubfC(^DAmpDkspt8x1QG4T;>D ztyuqDIZm8vMAYLaz_T&^*xu6~Ml`iy*Xw7|h5q5NAjE}in=qbvET6*c&t1SZPThi@ z{06H3R9TV?8Om+i5ds@RRzmAJceZbtD)x39fd)Cx#&g!jvVV)q@UDO9aOX}YTyPkJ zbL6G*Xmk;_q^=-unugF#WnI|8WHGrbxQk8u|w}2~^0?MM-cX_kqahTn_Sf?}m@(X7U?fIAN3V1gCTx zlgOdnbdv60KBiO$bbCBV!GSoSr8_W{%m($G`$fMzy-A~Y9>uSN5G&tymkas9KyYXR zvmJdJxFKn9CKH48hlTi`g5g9E~*^AF>Z+&4U7_fOjWp#rB6WeC5Mh3ji>a~hvj>DYOj@!1PjaG=%& z&c}44v%7VQN}aCpZDr%|mqEn>`^0p*^5+5iB6Amf*>8$oUl0kT?ruO?_UTZd*N6_A zl+&xHD``NuGRlybL+WEM(_g}axM%frJ}qbvuBr9LmolEA`sr;bcHw@MQy))PC1Akg zqUojsNAT~@DiHZ0p9@>Im!DlW4asg=3JW`*b3Iuy0_2~7_6Bhfvt%Frtbd*E{A~bl zhRsJ=ihn7(;(%t9v`_=};gTLfl7j4)#d3Ogllu>&NvvoX8)mbT|Ef3=I~;Li!pmp* zdGBj5RXl_DT*)JCyOzS#jsW^IGzB=Fdt^kz5Vq*uGwgirB|bLA7xaSc;nEQa9XJ0p zvmS1PGAj+4+O8aCWjTf!)G4!ytNBpz=PJIQvyptss>b2+=UMZ~nIwsxqfLdSXvOzX zFfEkS@-<^&$rLlevcZ?ZaLN`ke#B`UyzVdlxXqh%%-#Yr5^v488PTwLkQNz!LKFXp z+5o#h7m?YL{;ls=DtpqTAz5?&ocxvv@aoSNQmb>7Q@nf!ekhd#x?9XLt2Saq6Nxvl zI~Uh%dBGI-s}b4!K6sb#6D&7IV4h!!W70-5<@i$KV&F_4p0FV66)AatPe8s;7)@q8 zEyJg>AHl8V{%pwJJ0Q=lk%gZYGPl`{DCk5z4Us%I;%{d#h$Fb*k*{dek!E~r=^<9v zUIMeahOsA;f?1|f0IqVhW-AO+@z!+)Y`jYZBxv2jk!~Z!Nh{uwFvB6j+Tz1Z=5Gg| z?0giv-fL!uc9>D`$f@LF;y5B5q$@O?c?TN%e$ceN%1ojP3pdz>v9WP0Nct=yt*+HI{SK&%Isp4c{>~~XDO0JHHZ1G)$v%L z4JQjn#$wOz0PNnVjB9HoTJ_CqP-DQsFJ(P)Uh@nH!{pJIjRG3J_YGRE`2%X6#!LEG zktiwC2#+3h3*tU1fMKLNI90X4RI^H?5}yI7wqKFWtSFfC_XGYC<`H+wdSJ~xQ**n}m_Un>=!$-D;9E;qKh%oY1S z&}Bo{_~X@@!3$W|Y@|h`!jOjZc4Cj#`RNBW|(|{(5aB9jE>ZiJ~S^!LJ4+SfR=%f85I1 zwC2!Q^Vzd2F_Ff$h2WDe`x9z(bm#b z-hbwEWT>D*^E94u>Q`TI7A%8*ED7Yf;Aem=Yl~>9xw=4q;zX*KRX`h_2&kO37CpC) z@&3~~xc;!+NO{#AF1huRgyQUomaRV_dLRk!xccb`zs~9?8f0k7*Bsh!JZbq&e%O=) zsHIdA-m~#9x4AJCEp>6_^J1owmD@xcW_?B&>I-YDuB)*RM=+dtKkBPISo-Lk0k6bARa`pKBHdhGZoSyFRnD0yU( z0v2Ukp<@_FE;iIL2e;KIwZNXWRaddXKU0~Dwt$)BU4d)j4|q*b6nXKb8+#T%W(Pag z5~+cQ^pW2^)LwWT6w(Ta@Z(GV5%M?lENHgF0+{Uz5Cj6ieoQivpkT3&;v| z3S3v1lM$w`(1C*{AX5}da*jE%n%)hpc>N2!FwTKnGW8#I>^3KE*N$;NqjF*K-WZtG z7s;f)o8W)>?x;K47xQIe=4;c9r=Ge9S#PVMYyU!=oo0YEly#(7R;QQB2q64Lvv);qj;T-xS&&w>hxLi&ikCH-KYk(eBQv%_DJB2vaP5_&K!K{?_+*KM8B~L7fEMKG{9)T7joWSh6)=5 zIJ#Dgmf3zo^`~v<%Em|NsPG7q3b`)<21)il^aJeADKJq}9PVuUB$#(QoBCLG;DZ~? zIcpPpi8opRAEz6#yKaxrNB6-Byh&E$c zG$h`z$zXf-7R;ZGU_z2UnSNaa*9vt|`PH#Bd&@`ExnKZF?T;e8QFBD%l^7>ay$9}_ z)WIl!C1j6mgH`@l(ArzsFzi}ClFEvPSH=PO_3=9JR8STcuJ2$CDZg3czx||Zd50uK zEf${Ny+Y>dO+*Gpgl(9i#o&>K*kAWDj#T)BvLzk{nFBWBJ9U0U<%2VG5W29JmtWvL zn&o(|e>e-49wF=+QA7t)kCBRNDni4y1oCEA80j?8B3F)Dvf$KvtXfgX)@2z9ZJQbU z9A|)ccpAcC%>o>2=?@y?lHld{L3ng=Nwk+ zLAh|rh%~k({v{4Lqz6_@y0{5;o!rq?*=*USMeNs)*4Q;n0#1!qlsfIS1vfN`LE?B@ z0JoU{P7$*e*Pn6M=LKR>&3&#K$FtSXQ*qH#Th@4*R5CZ? zHXCcd51$kla!MZ+vBKL3?7eL!yRgq0a{#DdnKF>HN za~yl?*$TVX&@gFS0A;mXwCsksYjKN%6u8s;CA+};v-G_*&8*AAiy%5eG?PF?lw?njhEPSg`X<9 zg2i^+gKS;ka5aMq8h_SKbj3|N=69E{Pwt@|O2dS=Z_SaMsW4;PH`a3BF8-E-F5S5$ zryg?6BwRRUV*;l#@3k=WV-%-0!AR}_+{7I_z=4OK!th|lH2nLK9*8+9wM(83xx&Yr z!IFTpc9CxyInT&*T&=7O=R5hb(tG(rHG@31a7{11J!lx{ywuN)Q2D`aaX-!;Z}ef! z-do|`iZW1;K3*!&aRg`L3GlZ-z_i~CobW!!K0n*R9Upc8H~(wpG?H!tvCceP+fps0 zRX3zoy$S4gpDa8u-;rgzeiZv(y~n!z4Z$T#&vI!zbv#5V9AEjqgB>+<63%&)&OZNQ zgLMw5fCUF<;k_1V@UxdcxgrfG&FP8|YlREbf`;S1N1ia!>WuKQ*?F8lDi6&ogM^#H${`o{t;ksOQvMY z{)-^%(rU7CNe<@ae#Qr5*O8Qc%K-UiL+-4K0G|iz69<1?uwlzu%z2)HMJb1fx^^O2 zaasqaK8h4RcelbPverTq^IGBQO*gUPLW)-m!=&%a3Q##FP96lE1qSPNk_{<3@Q3g{ z?h5*dTW>`IQMMQOGsu*r{=~3++61mW1;GsWBKUraHIzIsf@`-^a8Bs~w$BYD3*l{i zAf*mwzn@8LZ&b3gbn3aR`lBG$Hvj0E83im0z8JM*(!c^pf zqin43UK2A?BW+?I8GjM3)YAdEfiuZl8VYO|`CzNG)%eWN9(LjW%WVIPXq-|x653s^ zm-^?P1X(7=@KjD?=uQflzF{Y#NIi3T&nsot(&vj-W-?!rCT>8Um z#|6n109EV5v$JyG<9^o#EcaB+<~P|7ibt#ek>#RrZD#tq>qUHNd3F+O^2f<; zsJ8)kf9Pwe`PGNqtxcuEO9pp~Cj5LPym43sTX!NhaX8{i%^bMqLt>%D+V#S5l}211 zeakjFJ(E=G?`Ln?-e;5Qrm-$*Zmb*Z7M6B=lJ*wla9XS0N(!uPEVmnI;m{}w>S`Sc2yrO~>d>GKuJ% z0_^IRvEr*yz_IZ%+2!>OL>_9vTejW9Tf3G4sOz<4yw)0VY+TUDNV!ptF{Ezwj$#78nd6b=5dq1Z3V5jL&?~GdZ2lXTd`HE z41i?|$=oNYIDgC=eCG8+Qnq{<*t&2eSz56VtX->4{=^RfE9f%ZZ*dZK1nnUgYhuZl zEG?L2vqQM~>ImFb;{&7BtAvB){?SEyBzXLpLh^>U47l?m*dxAaKuX%k{0|y%_R7~- z^XD7<6NZ42?3o~@(}3uh7Q=j-iQI#KcF@>3ALf3xghzA@;Lw#4@b`El=1to|g8$Xy z5r)<9h|(02zw;tH_r^so!#E0XjR{0=F$3mJjFL#xuYo&Y8@VyB2=7W&B-2uNl3B9N zAUD8)Xl;oFdrU?Ut?(rFZGSh1Gi>0=eTu}d)PPvuO9uZ;TkI+v^SBG+UxOb#UP6UQ zp18+ajIYf^x5q|!r|pVaC+rzysCW~d>P${JqD(-ws!8EMyeKY z`C>%wD@fTN=WiCT%=84!w}0W=^1woSl^C4o_ZKsp{;-uwmH4x@K8T1oh3T^cfZbb* z1HS8^gP)(0c;~+)dvGvR4DFH!yTsx%*4H4{&1V%3BJw`Xh^Vy=qpAyP!LW+Y>~6jq z9DZREJ>a|tE(`M{-;L*yiq@B4`lE7i1xAoVdWJ|@CguLcr9R9hBLJRB44zo^3G4xiG-Piw7~tN@!w&7?-?|5+t!_Bc zz3fjw$s=Mvr46_#R&y2|tF5j>i zum6|^?++OewtK6QAwh5O%uO%J!d0o@VnZpr?PC*=4mF^&I$YsREeoPB(Te;@=RkF9 z3|J|gNk-eehRcM}+{n)x;pW91a9O7hoVm+gU8el$Zxn!Q{V5qgFfT*|hVE!-%g07qX4ovff23QO;?yO?x=r$MjTv?o*F$Wt&MuI?sXSTybIMlX)9VJp zp~strG|Ec)?f|i4c*aui6)nQM0mjnF>@lHtT$=FP{|)Pp)RbhrJy~pEYs~$PJ8hT0 z_@cDx%oFMBU92>0(G+P@tD2MxjIdk6D-r&=8DV$l9N>1;=Li#(-bm~;%8E<?KFH$N~NlbJ@tPrr3Bv5ol1fk#1dK12o1IfJst5xc1Hf ze19Ne$CS5n&7Zg6P?wwBv;IpUSDt9IO^yXxYgRAyZ9T$%a7)C0lWf@FaaNLLUDw&* z`W?7ezlhU6GYH@QybmAA@?pO=I^m^V@$5fm3v9gH5PXSRjpyb|pwsDaBD#@E6jP0$ zp@oOg(V36+A~!(;bVnFi*ou9gmE-kWN=VGP%^cPQO`{dEqWdvOP%LI?C{~Hcg_i`5^iG_%Ptr zxe~|mDPZ|-9_h+n2kx4c;LnYUX#Ch)Bq#C}(J=6XZt{@k?UBJa)%q-CCYZA>Yb{9e z1`RS;YcQSNRtmID8d;T^Z*tZhqT$bv4H^6lA(@BK`vJk zc@!SqsEjV?hQTpsw!s1~4ftxfH4#0$LiU{+Nz`tbpuN_4WO#-#7_`(73+ZFvr`t!? z9f$yyBP5baWC>5+s3ms_1`}_$g=F)WdSY5q3;y^f$d9`Lld}K62C$F)Z>W6#BY}Rz z@^P|e-Q%LFd-qGQ>uLMurI+j{J##7H0@8?VgQw`1TT;oi>_23rl9IhYeJ)Df{>=X7 z#RQogR!4Uox+&{T)e&!X8B-GT%EZ36W`zBZPld9Nf=HR^CU^TGuR2SdgASvROKVDw zg|wBRD~n2Agu9n`_&t{`Dj#e=FEQJ`V5OqHdh?$W>8r!`N*=#y?53~i^WRe0^6VOW zlcmdLu?dmjY@1R^{=!^)=l30=%MXCPrpihC(O+|9?t{15?>bZ|8x}d|f9kvqH*eUw zZuO3p_M-oHYQlym7qFqvV(@&`AW3w`Fc1jJ!TGo-Jgh2)yXyW7-1Crd7rz>?ceUkl z%;%2cbAPU~jnik4P&E~z9U}mwWe~jjubWHBI4<2Ypo!}T&0wFmB77#c9$4SXmOFEl zVC$`P5WGQ7Rhr-e5_(KIm(9t-yH)Z|dE6nOt|jLK*X#gyM%)7qDsG@XbcpcyYHhrd zj=;0VnF4L=Hdf3t#%<&JrOiWA!Iu5GxG(*-EjQN|j2;^UmVW8OA=BRr{mbv7yv_Tm zMf)SET#ZW;X(O%Ol7qxoQed{lZ#w?KeYnYK6uA@F1;xX1(8q=za&MlW$nd?fC~@{^ z>X51@^DP^KDsF55+vb|1n$Cr!#(5h0IlYTM{C1Mm&m1O`o8W1-uNBgrw}?I*C5E-S z4{_|ZJh~qz(I^{J*#S11e!upKZZBF!?*%>OjxDi733pjE&XuK=d9TP$0|%sV-xiKI zB%$s5%21wbp0prx3iThGOON>t7Cl}rB#lK1L~BS2P?{GcF*ctI<|h0BBfBfH?)^GW zbjKVDYX7mUxQhW9jXglW|{J z9Q)zYF6{SquzdR8$xfDzhMUsvgA3+Pc-i{HV6y3A&Z<%#&%L)6TwYfKlqy`IWRwIv z`=t+0JP(&E9hV3LUQNaEPTsi7Y%$O@G6t*l7hwA<7TnYkt)P+Vz*+{1cE4&if}d7b zz}&|S*}2`6ZC^Z{hF86Zj|M3S^ADbe^89pkzGoOc8LdNvlC6m8oJMwwrC>|dLh@tD zaQbDLH|#8YOwBqH=wver_suwpaxR9Gx6$u7URo+?-*X2z22_#2mW9YMbp+hr8;ina zJhZVUojlvs0F|c}<5G_)U{r_^D*Ua9M5~kJJt_s{!mUG_r#8cq=+*4i4H@LO)@gEd zO96bk*9U&xT1<*$C-CdPmgsMr9qo+Z3zNQFgmNhhLOVn0M&E1@w#5l;pZ1XCx9*VK zT9!h3&)Cy{&T6Rffg-%hE~P7^VrY_(fepV-guYIL(Xlmdgx7o(rQ8TZ3&-b@w{SmA zMgj2Km@f8!e>60zlq*ZprLfg^63s5rA=Y6bl<_s7m95dRMWccgd`$=IjsQIBi8>ws z@(&4G6+umAyd_6FJ!y*GC9>FY2{-C%49r$dg`HoM$+xjH$>Y1}aPEQ_Ftb~a<~=t- z6O@dlBTI^i^`61hh~0=L1jOL){R*OYhFP@dWu0`=z#@95{vZ8VU5gIhxd0z4naYwJ z714!9E6Bl18tANM9jZ6irqMmIBDDZlk$#UaeN^Qr3$O=h)z?&j7EeYgZ^Ox>tGm#P zs~R$eQMZVl*PTDm_?RPS3hckPSyg^n>a!S!z!t z-Cn1IXUVCKjvWipflmwQf@wN*kC`{B_%jP0n|YU(q&!7TP?J=(eFv@6tf&3zHlkMH z91^kj2GU{!sK?kusm~3D9zIx4MRuuZjBh+VHR1#PQ+xwns1=gczwSeBdn!8N(N3bD zFB9>H>4`QDMHH>qlqK#|L5+1Az({U5S`22B{Rytfc*q0#-QomMQqh(v)#lTmJY%FF z^`MQryXI8J}EHh{Y*ZcXZw^? zUa&=RO=j?t=oAflCqer4dD0V;UFdjG8jVUl1B3?X`9aVT-}c*M4>AtOVb=m9^uDAG2K zO|W%`;>{8G#hu;IXN4x6@%k3t)iZ|nfcwO0_cZu3E1WDn;tli+6!H1CYh-uqITD~Z zkvcywA~{9FXs%}znbWJo`E^W#;){#m+02Ecphbsh8v4K|R&#*$^j6Y&=ouUt*Cdg= z-$_zl){{rIHppw0C)QqKEm|INoesO&Ep76Qp(%s-vVz!ONGIz9oFthh3lUkPFgBjd zIVwh{+25#^jG}AFIg#hBog&pSiB$8vzl@DofeKUVfiNx@N%u?1tnoR>pg=5JpQ1=@ zjkd@>o*OK)^f-hb{VJw2m&U?p8yPbB!9VKpwwKzC-!0pn-$r4_1eve`(-FH|aK0b} zy>B{#7;uEHzCVV(N{dAsCx$`Yb!xKoQf-k?UyaLjIYC!1_(K=YT_UP|6-HtVjo|fp zXYmye>*84s`>^Dt0htu{9Nf%mXHTa%k@OvM+RVWa?%qX9aB+Dz=+|fPp{u8%c9S<; znh=4VR?a87i>CqWQPsi+6>Gtpq-<``gLr^+tjOJvPn?H*5~|Sh1DnlQ2XtIB@sG(N z?Ed_roKU?7uYcW&za_3DiW9EllVc(2)X2dnQ%6a!fAt5gBp8&s?ZeY*Y;m!22-y6> zPaYTe4Xd{+Kxe*^MCuuf3(s|9A7^(cw=;4&ql}PQQ8~#N`btuFFPMZl45J1n-SAq@ zBj8f$MC(J0;E?dc_~s2tc0tvH5wk2-@)U-+Pd&%;T5>3kY*;Q<#slCeW>t%Yr} zEWF`EJk&jEMcLMOxKFZ}HlF!GHf8z4`oc_-nH&PN_ZnjMRS)_8{2sZhyo%-z)RU4} zNcVPSlTCYVxFZ%D;Mqg_;I1iq$>(NkqV+linj3EemTSI|?ez+1Y|SUh-?4FIce4GIMs5dL2;gR>5wYz5>tXG2~+0EIhgCJb7ff zfSl*ogN;Q>B(&f$Yx-m#_h#l4qVda-Xx*tMm+Wmwp)8qKh(1p~W0$hT>8@P5zJ&@Ltv*C%$dN+%Psm#G&)=^5bg)8X{{#p~pt(+@D? z`xUro6o;?0&f&(Tx8MTRVPHX;5;^OW1bfvsfLHJ8VSLP5=)39Q01^;n5434EP;hG(k*tiXKVE>^q@F;p5oUrXQm?tOH zq%95ycQ&aAj}3Omy-&Sxd4ini_(cd`13o&0{PE_<$=OaDwTK$5~K^tLx2uFt=W z&j^xf=C3IFkkyfu4g}K)79F&GUo&f;C(jy9yhm z&x3pX-;=lFigDaMGrBOnoLsxc%993tiKp8*FzxDVF55vu{C!W5A0~Xd<&J!`R53ta z9`PeHpLa+rj@ZFCi&607PPyY*@EJQkcZGZZjsiKW&XPe1RnX;7mSp96FJg7Ph#d1C ziiX;c#phJS$jjv($z(oCwv0$3@w*@uPf|faegD7)xPV%>+QU_HrJe0hS2!(Q1zlJ$ znY4M;qWZ#66eX``4ab7$*ae&6C)C2aHATQl0q3yEf+7f2$J6&;H3;jppPt^POGn*} zf@UpeiISYIwx|W+j3a7P^T7|Y{KsKhz3mkVG@eC!e^ij4-qSdjdC_q1i9~orIgyM% z<4%IIQ{k9|qoC@i4h^_%h^UXQ)D)c|fljK_(a;ZdjXQ?te`rE&mx5^Zs4!`Ft&sk# zX`ub_Stv^_1rA#HgC3vJ1ixq7lZ48rFk9yYT7AEZ`1kvYZul9BI-8y7>BOP3!8RJm zck^zb?=b>-`!6IfPPwD|@19ckyi>$?w!Z9APcikMV~&mr=hIOMNWQn+#-7u1sK0vx zRsCTk^Enks?bp7ib{7}Z_fy`=;}u6DpQS<+u)~gC`umccZb2w;trZkcFQRW3m!Lhd zMbZ*QH+tgS3F_&iDiRv=$e5OC^lQ^Qc&)g9IkzCQs|XL>?+VhZ4N<3^CenS9h-4WGXlM6Yl)SGAR?OJW zwy0;25o=Eq*X0FJ;;<6Vu_z*NW*S~1u|&psc67N3E4-0*0d5>M97T7B&;sW)(Dv*o zQohO1XMbWPq1vxVOJ6iSK5H&g87l8Kjwz(m=Ny4gMDOrUnhX_G=OLTARB~&Fkw~K1 zfY#J}CFN^s>9UCPaB3z3zDw@Hamu>HW`;5KYAvxR!e7+=Z48hETV* zw_w?&aC~Fu0y?+NjqMQcx=>)mF?yY>U zYXvfIU#j|SD|(r*P0I8s(7ZYGXk*}6WZuz=GbU8f1#!#K$*o(2|3(|3_}H_^%#ckNs>-wtERl!lAW>LPKZ$+46c_H- zpu)kfFlQX3Dn<23ta2OqiJYEX%`*2vVgq0Fie(_$I*EwEK%6yMYJ?a4BNNe#TA22 zQnopXdPJGZCSQrB<5zs9UV+Q$O3z;IVVfmt=>|w5hyI&>dri6&9nilf0qpoKp?knt z^v<+cx+i1`P1%x5y-p7n@o!m^q4B0H~e-;OQm)fAG`xL0c?@zd)*8^R& z6p{M7DPWx17~-8Zh$izUz++q`J?$Dy--jnd|Fc`syhr|Wi%S{T*$_fLt>Zw!h*R=f zIU1d9Q-GgTb|R|=O=N#Gg4{VxV2^tO-m=LNM4Kw1UX@R!eEPirU0~z+{(nI6E+bvyt5-M~kpwo+2(7QMu z)ZKcD*13jL(Z397%7W4Kq0b{aMCS~0sLp})6P0CZW%7F4;!1kRI~cnC3>rZ{lT{;k zh%O(u6gk&UqU>lB*_W;QNMBC(zI(@efCKn3>6vMCEkA%@zTV z)l{(B1t#rk$48zQ(KNLzS^{}8^JDR}Y}P;OINy&3-1yE(9@?U^+)?PlJtw-OyPwp_ zTu{wO2*+(IqesoE(5)S1(v^mubfj}3J+f3sv`+yM+19@>?0X9NLSl+f8_Xrc6@QTZ zTQ0$iyU&Bi>W0+y@^?@zUWiwgs=|~>)zJTdhJ5-PgHYvY)YY|u1Z#O2TmTsQ|eBohqHS=oU^7bf9LwO~iBac$mF4gdBaj5M*8HY7MDyE&zvO7+PfYRNiA!hGVYYg)IjgaLP26Q^7B=+eQ){}a1#s%n4w&?JGJMmB;j;H5px?86VV~A( zobl-g{(1U4;O#gAI->^>jl@sfINx3Hnpr5h|JcuN$(uQ?$+(VUST!gB_1O@T)dEECKKGyw zfhN7R^(i%qXoaeqUBEh@4{)9{k60uPM^-^JlgGl#B9I7gM2Gt{THl-tnt1vU$mP*9R0)p}3KrE*pDYVaCv1Ywn;4|FZ95s(`VlQ}%|nUk3VAm_gJuOML8GAG>^aG4c($Pv zGl9*}J8Bbkkl7IyouE7gM_R2_4AX~qlI$fHfpU%y*3`72O|wmCwfiaRo2*S=J>5^; zZ+4TcUt2lSTm)a(mBY_l&JwSsJBY#ei!j`e0z+RhebecJTq{|rzFQ;F@fXnB8FA=P zfei18(i1ht66$AvPI^RZ2mP0BoESF(4f)cJnzoIk z3VpevR_}$P;k*!PU*jQ5KjMb^dND|u>WyY>P9-Z7Vo>nv5wfP4FUginPuawv4|I~z zN;LgWGF`Me2=*urCHguY)TH7z?MYcIJ5y6d`~FzVx^>g3Kwp5pwyr|EBDN!gIoqiF z2rF7q7leM7u7$0$jmi^I=^g|4%)bY zO5%T0TmLKQkkfhSW@apFdN>G;*yv5hD5;~Hu~*OwWi5Kr@|b9)xr?a$@k*+&ODv1t zBSak~NkDLaB6^@2Mt&6RK<1k2vfU%ElSj9lWM7Z9P_V@vxvx1)^&6JJ6+VNA%8@#% z7FkATKOQH0tZ;_L3-o1OMiJENxE6K^aYt?n^U;nW^Jtpu5PEpeQlvb~18$Wx(ft=5 zBl*xq8rl~?yK`!2G?z=?W=I(4w{H&(Pw$gUGRJCp1=Upyz6e zVa;Y;`LjtmT<(1c&C9w#(#pn)cHI1qyvhyekED0B^-mXk@N_ybtr~zg_CvC$%L2Vm zEvIkfJ<=-mPqc3!hAI{-pg%WQnp>y?$DS+1d10aS;N>lJ|GZxmO!KA}ht$!JnIfuG zdYOAUT@kIc)a+M5y_F)6xsCpZ#wz#2#M?7v-%V|i?E7)z>*jVjzg?jTWleKH;FzgZThz8XckG=QObhfr?~Ar&|BP~8S6nYEV+C0*NO=leBee`bdw z`;#1XNsfnqcK6XkBlpRkje0_buiRukCuKBYq#IuAbQqaC9z)LYM``(@ zaa6ZB9#I$$7e}ef=Bew7mM+%f4n*b9@kWDWat5rZp)i~j*A0cgTS{@G@ROwW%5FUP zp*9)zssq&b)UhWrg#;>D0A6kWggvHQ{3&c~bW)l4zFA%V5 zs_^x|60k|`@UU)<1|L?9AUC(&;CO502~K%$@XB{vKzBkicD}fqUG5|1F8}JlFVY(E zr1gtPyvqf=^_zhF%S*u>p`ixKWzVcjkMHgW&g#L% z3zi(kiF(g4T<;3cZ;j;wmdpW39eteT-?O%hQ%-YDebcew^jXG0tXQwJY;JgX1?rG!n6Y?c# z8aZro4q@-cV@_$%4o-JeF>9G*Q1Ve6GWjF zZla@A>#33QSlK**7%2s%f@59N(4wtTr2lX*3LB{{yLI>udB1a<%)#anO_@ClIggH_ zZZB8C&RMEtXv;0CJn15x-aJ`0nAzlA6oBg}l3D^3yOE*m3f@@XPa0rc+yIeUgcvZa6Ds+YPG^2M*kKpiA0k;Vxvx~153(cpi;T7FlpgYT_ zsQc9^&VZ+Ye_U8DpL)xrQ$3u~@mEiY{+gGPvS%42?bs+@Un61$lk=eV1@^}(Oquu&mLnj*oJLq#}d z&oQ=p*L1Gy-CrC!?G66L-$_D;-^Gevu4E#X;I-p#NLsvu!Jp}2K#v!WeGl8>!TaLD z!gHBy>Mdo$d#3@u_)Tq+@`%f z4)piDTslNJlvej=aWVJq!K1Ibq0z+`1V(0%kdbepQsX0V=FKWPcT}djZ(4`%glwh>wWC58BOz`>Vm1L(t0cJ0MM?N@3pbeQ*;9Qjw zq~Yn;)5&NeZ55-V7LnVgSn zB!6ezffKEc!dEBmk_PL`_|y2AXzIL$^liJBkPCVZV^qhXm$Oe&y5=(YHN6np|C~w; zCIU&lh6YLR&L>>|Ug)x68|cixK_Z@=2A|exZWnwf0-?%x2dWO2qsbLbUZO1whC@KNnP^0+#h6bAeSEAHBoxv#ar@U~N& za@0ZMeP9DwZTyWiw=W^tBe5&dekV2TeuVOPkQG%%9}F;2Lcxxdi*wSztBgf!sQ&M|y9l zqJ4wYsYGoR>3MUL-u>%OSGmcVdvd-1obZo8Ll%Qa-(5l*KToCIr&?%P@fe!9JfEU= zeHxfszzxiL3_m!&g=3!dlAaMcB&+BnEI;-HOf2!E9parRG+?8&u|b&*DPBaojVjP~ z$EW!0Vm@sts)r^9BZR}oN5hSFmdLu}8#(c>7muo+jLLp9B;|4}P`-x9$c%5qaD)?# zPb{PKeE>aS5)VnvT4XTZn^0Q8mH*jIM0SN>_v$P%EFYo6aeskByFYp$ccv!R>?hGC zg>Z!OQT%1z(JQ1t0y`jz;de2i2m+AstQvCzv3%fD0ze-b9i&dm>@lL`P^F zb(Clq$p709%4nvN7QO2*NLcwg1739f0S|Et=s;KVbGpNbf2Jvo z`tu%s2<`;&$dyiSu!N2;kKm{~w$S@|AADW}$mN|Fsc8D6jJzYHn0V8hgBHUJH4^p* zD<=~P^YG}t6qwA}(#V=mIQRT2sw7uc7a!XNr>{9lw6!CFdLAFocl}II+%vK0%E?&lCy5z0e4*ug}t*viE;%?E)I=?+9{!6k?$Z%{-~nyRxc!CxkfA?E_wkOXWSi;Bk}+d%PY!sf!s&OFfFE2+8fGA{(>;wlVKNc) z4jBxizf8cs=qhYB34@!T!c*2PFA5OO@=C(Y2Z9@$cvLAn3yi?727DZuS{doN9g?e00Fq%?A_c_liC6^PEsM$pG-~`EXhb zoPh&v#ADh^xQh; Vp`yH}|IzUdTvc>2XL}ktlc3rAFW#F*@XJcqle}-hl;0%lRoL#*+s8ebehFaxf$@OB8^i)ye(vI-Nw&OS&{Q^zV zjnceCJ5l$H2D;O~L;6IXZr5XNEz_GdfRtDF!+>-TS-Ybh`XN_TukCX}!;}Y!e%>2P zb3_+KC%5epZ8T1y-^E*GW92K&V%1G>(=i0S`b0>;?32hzca-dby9&K3-7Y)iqbd9H zI~1k5Vydrx9J<-s5Uq9v*~^vh>EmDfWc%8m(5~Z?WtM|W=yP@=4#_)=c19dSdmkL7 z=Eug-4O5Pz@Sq47uc9H#3DOk}zpc*2+2_*!#6hx8yS+sRhDH7lHDStYMTP$Xu{`#l zRCWJ-Na4@%FG>f;MTvu&PQ%ylT*MBSo{682mXz*@K2=hYpyse)=ZliZrEc~e(Vt6J zACZ(sGC%A?%=eUiPh-lec1#s}s+c>(EjBF8jtZB>-m)vzN%Oa#_+nA%!TitSTfb!X zHGeD|cI90VuQ?7%HJ|y3v%gI!QBCg>J<-Qv-RC*t+)>sJ_lG8lvt}wfY<;pxd^q_J z`l13$WtuLfH^t84&az+j7uQTIJ=7sC$?7;S_PbJ3szA%3WXb|@^(v{jyhpEWTf4*m zrYp4nZ|DmD10Wk`6fd59+fik zDwUh!)g2{CQU_%ZO4b`zrq~^AIkX8neOv#nl3Ibl`#gR0Wl? z5BeeECc_VgZ6GDnbws5Nyep;EA?Hgu-@#=;Cbyhk=_!viKcvpR)O*bl3(fbW;&LBHdwg$I7931%05Vs}>*FrgFk z09^SK{JY~JxKM5l&d>b?9M6Po5JN^hJa61FPPel7wnYLufUnNDIj?HeA|7N?qILJ6UZ2SmaA^j{xM2n22A#rO2I+iaO;GR zmq+@H9%K3Iej^h>`2xw2PC?AGWPxaREkAD5Qj0`WWx>eaijiq%@dE1<1M9zw9*#8f z?PnZ073*>5*9kIgQ>{mtCtIcd9b(NJYApf(=C>n zEwVmy-%DUQGSVXW@(E_&SfRDFF+xxiKFlhx(o7KZR7G&&;9ll`ySM(I;{1QUw-h}7 zL-cKU|Ev9QtwIrhq^CHO%oX?WZrXS4~qRg+H8MjsXIIfDzQ&%?h{4% zipBj8j*6+0mff9tiExcj!G86}ZT7>b%@z9|5r_|-nIIamxz27^WSIR-+G~5Q!CE~2 zT8y}V?M%Ec|CQOi(wBX_{Z)Cq z;VG+aoxSZW7d8}FFI@c0O2f>LS6`H6>7WtFUpj9wKS-=(HEL4`&vvJX_hX5MRY%T4 z3zH$Atio^B@jfU(%iG39yv5(`c-wrj<%QQ~ma|+-1jz|$OjfZDuhuZ$PHxV&&RzMG zf9Qe(e^Q}6@8`Y{=Evd>JPEUh?_OxdT*>$5IWAGOajaD1yN5op>OZf=OU@j`KVr4O z>UsQ9fvcq}6FTe)FL!4uv(ak?PqBA6!!zsUEqq@ncy(f@KxO(mfzE43!K3lT)|aQp z@Ge~vG0#Ltn9<)H1QS)17~$wUf=MRl1;1yR@q1~w;P8NjAV#5=U(saFKeJ?p;7W^| zz}I{of8%d^L4es5f$H&6{-9h9e(rU7rZi7Y@G+7Vyx1?b>HD3_RGF7DCJo+#ok_+5 zn;^a*M}3_jeq$aJZ}pzZxoITme0GC*(zIW2J2jozYUC_fVX#fmmGGQ*cRpvg zZo9KpoJBmp@H3Bh%W$D(?!R2C2A$(pfxFZh`&p@03uabXoj9}2wjpJQ)${QU)^}28 z@?AV!c>6B-@XUs1T6IYhtnTcw;dv2rrvLO(-nxbaUQAY_W$b!oet$%q)t-lUt-emk zv-;>5$D62XVHI@1$@0JoCF^fslt6EwfOq%PdAmr_RqLi@nM}%zASUI(MBWK)JHZCe zM5_aB6PYo8o-%K~EAl!f8`<3MOt8uuvw+V$sO4SRcFYPsoWR>+CKkv;9|V&-Zt)80 z`kC=!SAL}3B7Ud8IX`&(cV>T9qQE`!EVH94i|HC-WykeB{L&jAjn!iOf%X+#0 z80!qXQ-W2?`|K739k&*>*9*e^t*y6TixjLfbhp-9c1~a!m?b!7sc!wsJycL%^wE0b ztLuWY9a99iYD)yVI+q1YdT;V0+%7Z6C!FDbsuuIi9W)uA;D=T!A;EmL4V!qIXR8a= z&VRxjORr=i`;wW*(Ye;<*{Zxl|4Nt<=D+!lKT{Y+c{_i0zl~u3qhW$-vwYszEgu=F zZv@j5w~B8aoypr&OPG_xbD5v}ns}{&$C)MH`j`NRVf>|zF+7i{pXJx?AakuSfhj-V zY-7XkVYDV#Gy66)Fq*-Kn2d+X%(E{SnRU)a%u|DvOjW=>X0*&ykb16>xv@!$xiBe* zxfgkrnX0>i_jPF<<53eRm^XhbZ}0e2=H%G{-i>Wnc?wIbc!xi%V$N!@g7f;;%#Lz> zX6GkmJ9DFO-r;9UZ5r0DXEgavOp;bMpYDxh5+848`g?_Z>kV!KVU|6Ux4wjb18v|< z)<|OZtkY#??jOp(9IDAgnfo)Vy`S*DpETyRKTNjH)BGn;DqqH2^qVhy>psVZjb1O< zw>eN?)6Zx66TS&nbTCY)qPZY_Pl4dUQys=DDA&e)xdU^0X%Mq_@h-+#gt!1A5l z-301m&kMS;+j$4Qlm&qeGx;w~1NeVW3Heoe>H^2FIRdZO*BRGo95a2Xon1+JFR%JR zoK5=bW@gdZo6Ml!28=^4U-0^=zTgl^;h)Pc6+ADkVOp11G1}%Ic?CU&g86?r#`Sa* zU-C1b83_E%sA_NIch?s3ZU*1BHqx1FJ?%>mlkg%|Xf`w4##CPSqLl6l>hGRq+^$cw z-coms8GRr`;1#N1{bj}}rZE4GjkxzA<1)RI$wLYPlk7W8h~sg7B?jrw0kdff8n*FPd2tnQC)#2E(&TQMA^)YRnYo#xWsE zq5QjB3)S7HGdIW`-V(WKMg& zWkw`yVXk%vtt;&>GS}w`mOuG*w^x_cJE5l;PfchI{t@>~pW76hdT3grd0=iIk|m&2y2t5JHg* zDMS)Q8k9;YQ#7cQQXx&6)1>fto`0U_x7PFDIcuG@&N_SVbN1)+{=D9wW63T4osVsI z{1CTP^@!=78PXtMmdkfJ#Tze?!T*+T5>IhIAr@q^-yuS#g( z(I>3Ft{e1@ALEWyc4Gazo~TVRiu-m&5#2jJ1UN3*0F{S+qnhL|$TMV@bknHo-1eZy zyxXQi>>ne=qb%;BP$x4i9**&uso`jaS}cs7KNc?>=tIAjgmO=E^Ko4NGvsYD8I_-Z zhR*!*#!0@fIJLx)oWiV;ynJu~Y4llveHYdn%r0r-mFG4>x#ks!lCU`4-kUtW`~!VS zj)Y6jTI8#@4E~zPNKRYHVz-JiJc^IRW%0jJeMt-&v&IKo&Bz7DcMSK%CK9)KXri&( z&WnT74{#%-!%*21Sva-f1E)Sq9-TJzkX}#r;a*3b;!}f$<_<4IzEkES`#tLDdW<|e zN$VrMO**izGZ;M>+>5qw55$xpWZ@FHF1IXy63AfG2O&k>4LCo$m zWZ{l;Xsa~a;E+ZkpC7&#?AI@apYN6;&Bvq3cIquRU}pp$Wow{o9H1K)WF(R+AGs;| zQ}NO#50IBZ7w5Or5UEYG1lfIJav}2@_tJ}p?yMa2!srjzvT_>g-L1)Ux@1*>~r!!`%3(9_`U-1c+x`MEcS91zZxc%g>KuxvdeS$0vA1icwS z3Zf$MJC#i0=HiRld)J`5(1Vm@dEtt`nIlNwkM=<}#}yAsb^l*bt@&srkQHd2&q-C-q3I1tFAdohy85BvGt>YKdT zV{1wB_Jw@!wlmUuvDtk5@7cWRUG6m{@ zsFBu{F_8Q;9FMx0i_ZPN05)D(aBtWvq}ZJRtIvLip!FJfMMe^Gb-V*s@7_UcYbsdz zhD)11Nl1lbG{}CCA#80Z?Ay@?jLZeFHCqgdQ_jO_ogEN=D2m*$YXGZX9Beq62Oi>T z&|Q>?+%DgM2|A~6>}zvWenlOQXSQ=cRkq=>;Pq%(tqKWy+5x*HSK-goG`Lh;$bV=V zflRkugR94ffzgJGbZ&mH!G*#jc<5#BeW6nGk@_(b=f%S{eL8$G}PW z0GW+V0V9uIkZaM!e*5B4c!S(fnK=Ub8xO!q`3}j(?w_zT&^-!(87S+~aa_h%!obq1+QW=;F-*X4J z8PC4rmp2NLhjKKj)*DYAcugQfDKlADsVZ4v=7d7z>p&Fe1c#K=$hcM4v2R~4Ict?n zHbOhvw#o*7k&9v376DOy{uzqp-_c3ohTsvblZvHeA{1eT2-|OdLnsqe(D++>NTS|Z}+spMuwStc7PJ)?G zwE0*LYH|^~}uhSb*?)Grdvz$nbX$R=7l!C!#IfF~$c(f8}acn4V2SN?ibLx{4>R3PT54a-p(~2m2loew)UEyk2Q+m}B@(eY&KeZXNL&9Zvo`JQ1=_4wAJ^c0fk}x&EYx;O_{2e#(-> zC(VFuHc^ndI0jUoIKkj`bFA9?4y(U-2N!FOaUUGI@RSm7RIa+7Th0te4#QRPv7hU} zAi4{UG<<=6?h2Ed>)zn3a?rdfs_Jc!1o=&Gtc!Q zs$eI#?n(}}u5Up0efDV9@kUhP=Y`vUJmsK4jWho^n!mMjB{5C#!3Z@Q$lA5=ejd%x z{__gxdg@`BiX~+B@t0_jL_^S4ZE|SZcU18iNxmQWh?)Y+u<%6)&R6b2Iy>V~QHDP0 z6Sv_-`Fl`uvm31F>EmV?bm6LnM^MbMEyVLBPjm~TdMRj~2!}Jm z=_tv$oqJfk99%!o5(h`#MjxFnaC;3@xLezT)KY^v~hpLI~J)+uD5*Sx}NMt$u-SlnRVTqb^K{A&`FtGe|Q1fLJN>l z%^p}XE(s}l2jcTlHR#o3Es~r)k^KDF04SsY&bcQ_bf<1Y$pRHVmM}9`#XBkA1w_%)6Cf`zU336%CLNnG4{Ul3>Em9Vhf#QWlmwxcruqCQND~{U-1_{ht1=^ z3?}la)$&Bx?FijV8zlQ5?~oWehw~dXB8?35=SsgD_wl-a4J9jwu3eKFDj9zwl2=f> zz~3A*RwB1?Du4HAq0~T_#H)>Sik zN+ll0RW2di*&9&kbRXAf{6JghDw9I;0JQtY;bl*%;a&7B;xI4+kH(MCI+=N-b(ROI z;GV&?3Vzd(JnGykM zyS{?`TUp{RlEG^NPTH)I&@^ocrE%AbH0ryeW zfsyDyus3h#dY8;|m<7MSjWnDPqAUqr?l3g}^U3;31~!jwB2s&RpBvhI{o!qVv%?NI$f?5o>;JH@=OJ1!{u|`(XvFpM zUU=Mw;pl3)F}N?!#OmWuBaOr~{G(?WJa!I2@jAtv@-Z7e`(+-9OC7*nUk408_7DHF zbu_6k5t4JvWo$Y-hg_X{1_ykvgQ@yMYfy3&E80w!{5yFCYdp}0um5Sl)C(0js{qlQ$KCxX~48?88Pi_GI!pf~(`yn0*<7zUrgdCPNfx!*x)=LRtno5)Ip zE7YMxy%C3G+u|XR1Of*7@X|RC(Ag)SfMx1&`Obwnd{7ac)-nPm^9=m&WC;q=OT|9- z;?>c=3{tOsaLhi*ibk-McnevGgf?o$(#{J+FoOgojXjX$m&lb{O3sw-;xB35HEZ zRWLASr=+pz1}yh9gvn{0K)O$WN?kU1$jFdg5fmI&SPpmpoq*1%vP33Xo&0H~VO~)q z3@#f^K2$D4B@N|#Px2l9vb8msoO9u?%ZGsf2pv+fZ7)<@Ji#wll9RYyUdQj_TzJK~ zGKPMg{7?VqaO|y?L{#d|%hC~K`0tepAd|`Qf}*?-vL-J`P$NE=!tAS4iYyR`Yx1w;EX!7im$-Yra2=k{nHT z;MFGnCwX~iEuZLhf-jB`OIGKZ@pdWM((~d7{#fvM-qoT=12xuj}6wBL9-jEgKmskNuj=+SGWRU?jb zE9Dz`(egz6clRLjetQb}UG7Ev&KKy)Twi1^4T7U?ideh91$}CF<2FV|U|X9^>1?VDKp&GaLJ(IXEpyXx&m5U^5C&qFM7GqiMUNE zMp2O~LG!r`d3^sGDs$427_6*7cdF8Gp8pK&XL<@5-&%*{u@)?!CQEX%ZgA0)6rg;? zc2wkchMS@jR3LQ2LL<LSdVrK5c#@?dUqX9uaHJKwFiD~l1o zJvxE}6(nNKV=oN81$FZCcE1CSrsvQa;ffzS?;>-|#dxVqIxH+AWZ6-SUwjxVnX=Uo zf5~pahl_LZihP7qymHXVlT%^h>(Rt*?I8DHHxH&MDd^)GJ(O+jj@+RfFPn1-UZ%!i zpSE3CQ}dv7O{pfTOp%dHa~!}g^762dBe<=#1!qQH#RsNcMXOyOfY2cyH!QTrV*)$5 zHUBi>@9FjUkxDxH@NN|zo7jS%zMqL+48(DJQ_Ofz<8-q5(mfo&{V@@|2RBj?G0q9u@iP) z2V#;XKz*{#aQpUg6jQzk&1&3?+@8t6kBCli)vUpfm!HP>{4%9|TMf~{N+n6mTU|J$ z^BngcorWLG6hMNt3b@>ViJWDJk!3%gVz~_~aO(ms6f=J!D6cq)4Vx-aXiYx0Ui82B zn!V_NNhMcN;J`=7pCmErBVgc|tYL@B0AKV%ND})wV!XEz*CZb&kB0Js$$9snF?lgr zA}Gb_j?R+WmG`i+4+r2RfQ5;*IQdKmI?$E|sk0tnOU-B8nK>`;2*G*o_!)03sThw0 z9-W{!`}F_O=k2Puz^i4A{Dp-NxrQlUVDk4m>?qgKs9?TmJy>f-T5%;WaoN zycpb*4RP=vfAr*F99$}i1Uda3(#KuTFi!j~?bi6h|EZpQI7e7oszgTu(lATUY7Fq%?Za&0zvyD(=s|vjB`OO_2aKip2L1^};c4*%G z0OlV!1c3#cA^FQ?zGRys(ri*EyN>_FLFv07qHQ_Oh*2V)H@?BD#zN$9_ASWXUkcwn z7vouf<5AeY4ET`}26c`%(c#6bp|YYIyz*r6*tgrz_!<82DCRIgP%zl`fi$jQG#M2- z3APvB0e81W5aLk^*B+!n{RJKrgF``7GYf9(%^_dXKkV zdlWzZB*qEqb!g&RBdqgLgu7k0qeIgp;cy|3&D6f2HG)l?oMSeAV%LJ|u3MpBqM<$I znFoHnw2f;oROYTGtMSL(eaO_Yi?PMX8wSqvYxyr9Z@{;8=RjGkk0n#)lFzT+BX61A z;Mb=@7W)4}=d%P7m+!w3KmH`%cw`q=3jK(74n`mohqn+uKAP0;j6p^!r$A4rG1QK; z7d`y+6x|$*gWgydvOj(XbmmO}#cEZ9iPH|Dwp%MC9|of!K6^2&O}&71{R=>vl?oXf zobW}*rR3_r1@P%mGu}}dhv>A^FeAteG?5es#2dkXhvK2HQ62|7SfdZ!NBExAs=Ska zBpmweXLu=Lkz|-!7%AzDBWkx?pn6b=j~9D@Yu7lk*Wf&1y-dJT{e;9`aS1HSO$7h` zlp(%gE||P_#Fp+aaQx19Fu^IC`}wyWZ_iwWz76;0oE_wli2Oovi9t|0vk^rYH6T6t z2Mpa6yDliiw=u5@c2|&yfZQssmzRmCKn-|X89eRF8Ghr_@0JW zHCLb=&J$7Hh4ZLNc^ZDK*33;lB**3V=&)rVf7=|4eoJiG<9Za#%GPp-x7;s!LvJ_Z%a)Pu{+z4*C~ zIVu@yR2Fn7o9jv{#bwLg(K16qJ}!R(x1Bn`!Ra)()L-NU>wCHKx(s+a|0~{@T?{fc zt8v}xY2^HRbF#1~8ckIC0QacF;8y02!%wB6hXI#i>GZ20Kk_a*K50l(Zmxh&-iG+p z$td(i|Fm5h|Ft-n&V{VJ`7j!`4m&GLWcPQF-Ap;yzKA`990D2fzi-H7cpzdr< z+)5V%y~-XIrdCKhI`<&uEn-Q?YxLcCEx$4IJy~`+5;U`E!=Te6B}ppY zq-N1B!Ued)J)gHk*~c698|smrr!vSP9SiWX43Ol1SOe-w5pYfY06f^{4=0l)IPBCb zY~MQc%pO^sruQ?<-eX4lUjFr&p{t8{W{T!7R?T~KEzsxNueZ;?= zmy374r}5E}dW8ECp0!{!R;~|5(!?m3paS@j&Udu6WfNzcmxVQEHKHv+*62(_Bf=fC zu&UZ)PCrPQ)34R!i$j)@i6gzRNnovkmGf=>rGG698+H-cLpu2V7*A5azXN^076z9i z)JasqSLCvemW(U>gdUAKg=MpL;DU!;=u}XBi=(2@rwt$@W_J?xc(m#IGcrIh|{$LI77t= zuT~Zqc=*reUtZ2ex#wPSb?061!TuRo>-II=5vPi_c78$cC0_VWMh365s}-L$I?v6M zb;l{8xA7Lox9tCb3IAWp_y5n*{a=`H+M*7_1&4DCyTiSu$*J=UU#|C+9ybUuX#AKa z{oOyzNa^@!BQ52#hSs~24ND7#8tX;bOJfDCM%81?4Qp}^8=f1TW{_4dGWrFoMim2Z zrCa>L=%Ye{;qj%gs^_AVPrI)HzocuqrMsWdukwqjD}JfW!#7$aXTuuqrz>GcJuM_3W=;T=vz4%E z-EOL_a0MKlu8qCe6DV=xW@^F|WiVfzz>a(yLwWs5psbQ?xkt~gvB-1+6>58!8vgSF zHCe%%dgZM|%k8%$AF=~j->E~1XX`1d|4t?4W7@_l2D?&fCl-pIIrhN*Ir-u%#c@=@ z^aQ$ZoEbM#u^-At&!lb*{v$k>#~fMaBG%m+hwhihij7YuVAslp%qpD{iOk3E*lw08 zzGJYNvN{&eD1J@m&Z-^df8W}L_e(Hm=4LGUmP7ICKOOmfCL0*R+W}(pQwe{xC;-R0 zwM?_17hjtd#aYyaG49kJX4BP^xag=JBD&+5Ep;Yr&YpCpYTY`80>4{}L zI%7z|-)BrmLW>q>n zC{xvL@#1Qlq*iNlH}(o>4_e5qpH<1Vs%|BA;;9S%M;(OI(d>8q=?#Q#+uBs2aqL9+L{*;g5aw{ZCa?yDve z#g|grZq`SzVuk?Ha~tqB87b|x;Wf61v=zs0u%drRZ0U2k(-6~fNqqj>Z%SHMO|Sa9 zoaU9q^kL~|I^ysRl9aoc{bxD@OoHO+n|498^m!9IZmlXU=v~Zhsc#1NE5)4eGZVU! zn!>c#CUV*_VPr#y2EFX~cK*kJfPQbD!=|l+N~hVTHRN02Yv#^$ zby)Kc=&OR?)RgUW*!hJS)V zNA^I}e%i~9cb)@L3{Yq}; zp|isMqt`MP`}IinOhs;dqK!x|QuPjY--<8h;` zp*}#HN;Le4Bcd#jmfucP{$eyW6i(n66=Qb(9H8hKK(+0$*6lv&1WZE;JlUEHhVTDcsG|-Km1!{sx@643h(hl-6LZAXAGsd z+mzO-IwIb=Ck!qg9u%!Tv4a$R{3!Z%phB3@wS*BBhy^3p2IJb+P8)+hl<*NiM%o5nw(FnI4 zi__n=aSGIQrP2w_N^D9{sQ8YK7MnF~EQ**Yq(g?4@Zt&Mp=?GeCt321j!Irg*PKgZ z*Gx|*CoXfSJ*0!pq>Xvm%g@1})t)%27}Gw%-{9X2OYEBMjOCAGx@Y4!csA2kyhGK3 zUh>ACj*ZeqZ_^XRwX1$nhv>cZtj1OJi(VnUTc(+IG`>X^Tuos8Qf$FsLKuBw@_+P- z09okEheFOk!M`PjWdoB1u}03O&3mjNdawle)RUMC2Ns z%(z~sg#TI|(Y%lqL~6!EQs*hWIY)=foO+WsoZchY|K3BeYST=dmxmaS5#6G~xvHS8 zQOw0&)W(hXU+YiaUW`upoJRfkBE?JEYz4=PHe-EuI+fwML@+s6Q}Ex@`SdEMQB-IJ7g67|C>lmxSE7vUBITXwKOfqVWnM}Nz>*Mg4TE3A%WgaA)UqyEVK z2lBu7u`_LQ1pM9k!un-d?1Bb!{6nNCcsY4Cj2)>?{d{#%}Motd5#XfS61+wOA@yM%RsR_IP3Lg915{$NEnWw3Dsgd`>1Q{E;^{+Y36uR#4 z7Yy{i6hxmsfKT1hVOOl$!106o1PSw&3WIMRVqJx~g8woW(e&~q5VARx9k3D$e@*QZ zx~`~Y`+o=Fx_zew8`HzVoRUFC=7%x#B^!-1^HTt_@1NYIr$VfZnJsG>9(8#l> zf*W&SD!*jMK?mU9JNf8LZ$k0@4?^i#q#D@DI0cZvL6+NUgO~^mO(qv|3+=wQc(? znilw5^lFYSXMTS_8^+~{zBeUMyL|Pjpmh&LVf7~{uh)sNIVFt={;h|{6FVw7OhnB_ zYOI;_Wl_;SsrXxaGS*%nCBAL)N#r6KPKQ|dh^wk>;gD9fsK4BTY~MMKEqmJ`&NGqW zXWCkGe>X_rLCZ77ZG4UNbFUIy;mwJr#dbRUkq*0TNf1`6tB@!X1gF20aVLGJNcWh{ z8WLuGB)FlA8Rk7&a{4KUyJp7mUhm{tx58+=W9tayKSqVkb(LW=(yCz1@pTxMmow@m zW5gFd^jVh^Kbico-`V8if0BJ#CTuBP$!`qX$$land+ti)(D^f_L63#`3;My{w-EFc z`xqn?i{r5~{&O-@GJMu^=C*H&wAW=Pol^XUi7y)`c3rE)nnmfOFg%Q2=9<83bq-)_ zVIep7>0R1l>Ui3{tBIX7HkgEHXriaxm)W2+HU5)94Qw)`$%+zHdP{U2G$hFnLBn>~ zwq2Pn`}qp%=1}6?KYH{+Uy9!KU4*{wOA^-`H&HhvDYQwA9X;);9DQf=Rr*BcP;oNT zm)%_|frr-1=#wUsX$_})?9as4l-(Hv?p;nj>}iVNJ}YX|GCpD^zh^gRBlIH7zaHv8 z$y|PB-dL)(rjX*EEM?PAI#M#a1#EXhmC)}$L>g*JaMxB1?y*l6%?6GUO?<6GEwz*b z&%R1_0UJdpA28ia1c58;{p?`d1bcfyG2 zkA(@>-B^XJ@AQ3*SmFM8Ucx^s#)_D`3Bs>ybVY|81aPTIg)QG;gf>2|5vE?5Ad23* zkDdPYh>$i5XY^L=0W)eJ%Qz~Cb_RYBEtqd9_OW|~D$A>>B0n9bPIo6; zK!6!>+n)Q>!&5FR9+1-EaoA&)3b#Kfite&qN2NO6Wz@VYVRhg{&TMrrv)gkHSy?Lw zU%6FKm1IFp7%~vdzMqI1FNGkN0yC;2U<01+>%qE2xlpBX?o^nr1$TRN3A^50fofZk zN3~XkQZXq!^=9xrH6Z;AUF}Nj7!5zXXHGojyon2*iqlm z>vd9bU{RcYe}4vkU=SuMJakO|V}!guy~KpNGFnXpfem_Z)KqmH&Kn96jBWLD&Y#h9 zZybl$+Q+iZlf%SoFOAisEIb7}#>$HSgqZ0ExbGG*CfN|_=FE0~(hwYRiWQ`UC$L?M z5zhKOOJ7p%44&iKL=(>(7QUD{gDGwA(ciG9mzrd>RR3XeFwA}Y65A+E|@5tYLMp=?Pl@%Md&!F>IZq2uJS@)L+qO12v;1 zbV6J@b9QNrc;@2k%mw8p?wVFEl`pX4TUE311HULPaj=~B?0H4~y?TLl$TB2(wYRwh zy)Eo=t1CpbCJxTnJp^o1N`3mV2ZDl*BZWa4&v{W!xjKa6vmVWC(Egj0e^CwPF8IQQ z_O1}07l%_ilBM*fY2T^7@DtSddwc1H`+Uju>+bBnIDEp3=&qZ<}bc&!?>uXZVTOQ=%bY zt&XGBY|iqs(Izm$=p1+H^LKi3j6Z$Vyo4QTc7$X*7^7D6kL;p3ru@f=Jz&y3l_)8h z(|JvQp}TPc?%OdJ=errx*At9k-?OP=BTsvJ$$M9N!xKOmGcv?>9Wt~l{e=_j=2If3jZtBZI z`r)txqWG9f$~e{vCT^C9U0!^nFLidngXNijPr-|Gm8`%DaKqk*YMl?3|uW-wXLn7@IRZ)1`A(3gT58S6HHlrvG zz5nVWn)xtO^m1zkJMiB~QLVy1ChcPeY)C6%mn;Yntyw&m+HM#scAYE+i)4M#Ix8uu zS}}@_n;F8~eSVkSB0b31?LE#(N5)b9CxAa-Sd5)}-8sGYg>?VA8p!+_bvMQ=QE0AIGTQ zHyYVr?N@|vYc7CyNDp#~aTRMMThS&lI-)ZzN_1F!Hm2^rWqroP(VmYjz$WMdir6y^ zTej2*JtO|2x)ndTfKTq+eJ~Kbti3 zt8h<6zi3_6SC$Qk!LG$6LYoUQP+C?=y^%K4T?e$p^QRTk%NBePmmdBg+LPHvY+@t5ZH^VS>BU3(^nwe})Aw1dR8zpr+qIBL0voYNv=&NM42bT(9tplFGFVtY z73t{y5j{x$gcSm`SYu9&A{rVL(K;c%@Y9^lYp4+Um;Dg=Hab$<{@fScMBAySwXfj$ z^cn1eWCJ`nilyFvbf$bJ*0LnEL3F39j@>z>5#pVU#ax{>rQxDQH|q9^Zw#4E=O4Z= z8uRHGX;RXr-uSE*xg0NLs$6yn^Z(Jzrx1U^=wC;`!08ND{-n>H{Z&Ix_@giU^XQ!5 z`pC6-P5yF5{F|j(#SGM*d&*@SNO1J~F@j~nn`p?wg9@h~6VC~V6bRkIu=TS<>TLaC z0mUv51S=h*Kbv_`Z(KD6vD8?7g%87pSzli0v%BUCT+DZ4UoBfUV2TkJc~(XcxLi+Y zXnlo^J?J3N)$F9=*{x8c6wl6Scqlk}B30PjT*2O5KNFX}nJb7|vj%pQ?x9?lw$es^ zV_ETuAGGIv6>drON0Cqa0g@*>0pC$-5KH_V=mjBC%1Qe)^TH_t`p* zEn>5u%2eP9T{`@0f;i2^AL`VeiadTSCNjaA)a}tnMUFRXnb3hp!u^vrGQVc#2}~cH z0MqzmcsBqqTq4sX53KPL|spLENFb6C+M{u#*}pzQdgu41?{U&=&P1Z5U%pJ5Qx5? z5h#y{$A_8_yC=+(n_}!EShmzfxOaL!%XY^KW{fwXv)cmUpidM#dziZL+p34c%}c7; z(v!aUm13H}nG1%ay-woh(kS*wvkM5a&BbAUiKu_`WctYh7lX?OdnKU(E6CH+x+vrC zDrP<>kJ<(}=?23%ocD?odwAAL+iLrHYC@YN@Uja1{CBA2`mR3ylB^n^w|^P^Sp9{h zy7#hJ>vsm7JddNRpO42soBm#6dNwg56ZQb=GKuS$lFt ze$k=S@wh6c{M{TX5R%!OrYS-n%QVn`_Z$V@vllzu7^Ehx>=B+nlS~~U!MIZ65IZ@{ zgEn5T1I4aUsNyxonA*-bwv2!`cL7umtjIHHA>WUBm)P9Y-E{hv{^+)+x{?UgE8QT87B=D%Y;;&5uj(7YHNZRfJ4q@%(5 z(}KWH6VY=0bPjCxi=))83Fh_9MVnv0r?!)JLE@BpK@}Cxj1dufyLOi*Cj@1 zaz065);C4C@va)~J9?DSeLI0${pXp$VkQX3UK6lkuLJ?85U3a`-*we`a@v( z{g?1%-~v`Rv=Mz;n=9D4`z{XQMzCAn6pI5+x5DvD!#V3~19+F-X@)m&mu}gh0ZU5) z;CH7ny}95$^Vshs8n|pLdA9BYR=pU@O+I~FQu4ZqAFuM3ALK7FI1 z&wPAs&hL2Zz}l1#Fp|5L?B3uaX1!tx7N1Ze`rQh!=JE|jyXFg9)BX!tM`6h)uVTi0 zo4)h`pTWHQY$=Y@-jCMR?GnFR9)V{!x-u1^1rpcgLNMN^gzMg=)8C>an9#FPoSpAs z{)=q@Ru$@THdRE@U!u+b4zS^^2Yng!@?J9To&jE4lMU_@e3%_X1DrN*=EhE0$9Svk zWHuhn!iDP<(M4@woMv(ClpP67!+am6_K*Sl`&u(^{bMETp&CZ|;~E*G|Mm}Qn^)NE zr&i2Nx&V0`Q6<^|iumYMZ^qPR7aMgY1f_aL@$D0Am{~8kOXj^xqHdY)rFZS^Vs~Hk zpeGchiAN6464_?u5d-rM9I|)M z5=7IV$x~as_J~3!38?q>g)qj;oSonI9_`Po6YUBgPAR3HX8)ax5?z(w!47^Yhhg9T zuD3vVm*^J(6cyBwAW`dF>e|&W?rnvgG=3|!e1g~SLzn{z{MVC4`xozqgBFy>m z+A9o4{Jq6(zqY{0;?-34?Wkeghn;c!wH@AENVz>!$oDcHSj!;H=_&qiZy~w%JA^)w zEM*_{-^RZU6s1)+?ZHgFo+~?;B%Qr1M?^*fCuNuMN^IT{HSwbg8)@nu3)a|4Loyo@ z*x_pC?8KP8>_>;+jNkBGU|&=PlMFRU@GBMeQszYQrHSEqK=MX%EUb@NU)U!7H6xhu z`Kl$}*wn>oiS5LO>)r8CNr~|djFuFA6hjLxLN^M}(TyYLGybv0+=883_@i&eVd>Vd z;`uieB#up;OP;gpvqm!t_tzqO zKXsx^t|7s{@l0os3(K=Z4KxPk4#85o%!>^!65qW8^aZa7R@pdTtamw`y}7dl6%{1W z++lS|!!8?`&nu!jwu4SQe~W(c&{e#+aFC$8ImrM002X|~-OA~Vm5%~uxFgO|?Ik^_ZkV4FVo+i)daqrfsdQd{Z%>NI+H z`2uFr1)jfDaDZJky9`S1%QA73p3uEcvf@+XaQfB!vs}F|NBa5{(Dd>=y4tjY`Mq5Z zWsYwrGe#EA9`_LrYWUix-FaVbka_%*xCpiSiB(@ZE+XQ`jMTGrycEJTQ%0T@=O76}wWWANL=t{$e3nx8W4CDqts*v#XkQdd)B$ zH};_0`$m(r>Q*$N&W>3y(Tg=`^hbyL0{9R99COupp=8?}O)6{XpP;vklbBvheW88k zeOf)05_E9!VCY(k4UP0TpGP<8TJD{oYQM9<(|V|G5Y93Y`#VHW15_c%s)+MGtBp_e zbm%88DMstE&miHm2=P`k8^M38wql1K7b?QaTQK>An!r6^7HxP(lL~gK*6#_g)+151 zf(7^D^k;mN7Z@C0i1mma>w@LE{@_ggf|p%_W!+a<_+RY3S5y>Hw>3%z$vJhc)wQd- z$w7jM1Qif7pePaqC5jo$VkGCNfPxq?015&Mf+8RyqL{$|hzbT21dJ$R_G|C@=3gm4&UShHMJ8K>J3&o` ziO4h4?YPp<3fh_oXM2Lte-a~!vDX!gyHM&9%a_ApKS|@zWj%ytt z&#e!VATmLfc<+l5+i+J-NAz?u`;zX&gzz!$cUpt(-=(EHv7`#CtCjTrmc?*YjJ1fx ziV19^)m)O{;K_>$)#tWvP1QTYWBH3RudoHA1Vsz{xKm{9nfFg4b#rX(ctI7vN&Oue zz2Gy$I<*%-x9+|@_h@gM&X1*Lyuion`Hx1dx%EFO{$*_!rvKq=ZpHpZ+|_$G^3rVX zGk3kEx!30X;HoKX;KpCK=1Ticp!dH!tNU=xPWtX&Hyv~D)7%yDo46;+@6+UjHn%Ht zFZ-)PS%*n&W5>Lwa5Yygq(AfgS)bx%y4xElZt9+edhZV#gXFX3?M$_KN*+PTwO!1=by<)fi{==|A_u^!K9GB#2q@? z8YUQfg3$M+5A#l6?a}-7+?;RJ*udOT2-ja`AFa2rDM4>o?-TcuLFYuxhkho)lfVwufImBbRsMTs=4T>nu{$&Cr?CMCnua#mGHbj{d8* zKV0{z?{#M`N}zvCHl|0PPNXld`pBJsdM^L#yk35^_A9moXZ+i=6GP+Dfnf zX?Xfyq#3BmVCh}_HV*vcHxipWLCVE_Nc@jp2Q0p zo>f|C8w@|yI_65@zn#yi_Us(3rnFs}%Iq0!S!$kEeno@Uu7C4+{$Xx(+q5@i(FR|w zprLEpGEeW(^J|}JH6QhZ2#4+bGNE)j?QNVkTcgiO{gO+EjvDiXc=~y&m9#SJ zW}is3jhet|ULp?YTj7H3KjG<|3#d2!uuj5vKl)v{psCky3BF!xjg7bN(eXbz;h-az z(fxK)Fm_}sBOf8)XG=7>TkdaVq=Ogggpikz_+_qceRUp`<>%n@k|Ek;b0|uR6p?R* z=crVsOy}yqx4hVJTc-GF9XcpVgMNBEE?A$%?~y%Ae*fOc{bp;d^ZC~S-j%2J{P#XJ zl$z&z-p05Otnd+ac2RK^wpY0HHY^Uc4xRC5faHRS|#NL~p# z+;XW3z7bsQtmIq0pF&^%@rUhFenrVOt3YDvMfx|jpVIG5rni5)#J@KpPCOdBs55sT z!TQ7|GADHxziUz+)p|2ZXVx=$xV=}FaxsbICXaS#+eaTljjf-wnkGf@x0{{ky))Hf zJ}2D41(EgIqP0TWT0DE+uM0o%pI907BuR*W)Ht0v(<#A=8$6-4^J@VsURuFU%MBsq zjIy@Y>-D^KaoX^!#!$O%$9*kgt%bH1o>KXTGqjYdcWBB?KB`^+b%xf82UoOsryT{R zT=VGpTHR#+G*2!4bv4>t(>9v3>%P`T2X9bcy^`PXD4jMJ-K$-?h~-$-X3{@@@_0UP z`n5J4n9fgmX@wKkRdC~qrZcGKQrHJFN1xjr*6T;RNl3^YUbtfYmE8Ptp>MLf>TSS|3?uBpPhbwsKDC*0fpclvF#iOBHx* zmSnj8-@XF99ghbXm#t@ci*LHIuiUt7cJ(CQj`3jQ-`l#_mLMx5g`{FOcWW?v%-({R z?V`;}M@H(8YMJZbVlxbuo0_rCDKWfv4l;U2Yb1;pOrzKp>%>j|V*xDw7h=Nya*a*7 zEP|ciPjQzRrWksQ2@%ov!^~r8DSRx;GjaC1&pzhA(>*Qui#oar3FGoy*ZWeD(S7p_ zUhf?ldSpc0#5qITc*jc_V?Plg@Zd@riG}&HKR!P<9BlHWLpd5c)=^IM#h^A?{U|^{ zx|qO|(owhQQa&W~e!%%Km3BXA2N_BexxLMsjW?bR;2LBO8rcpb9{;RBo(4VR21RJl zp_Ky0dAOP%I546c^Zqb>aL)+0INMmacl8;g^zUl)Xx&%i|F!`C^B3@6rm?#YwHW^2 zKhr@QLjpF3EDsOZ7_cs6bI8W!|FeCpu)s@JDalFf?AH|Y|F{Fo|M3<4|IV}jkI(D> z_kMh%y0!fexNrWu^>CuP^7j;S`R;NC+pZYdYs{(LU|A?mFViZ3+g zy$aCO@2Syn@!Y6cY;{iKZpmcLg=dX5kG9llY&mgAqs5ld+N3Z+fCA=ec9cHV)E6O| z4>r1Lu1b;9ysR*+N&mR7Aysazx%c3Zrl<27O})B6%~Cs8%`0CeG%pN)(S)5BG(8*} zG&A?hX~xu0n#d3r*FvEBfTPE`dl`y5X+@5-}xdw!Ei?y-!K$yMfd zn=0ccHiNmMG)!)0S1>;>T_j5u@R^d?HH^{>4_`A&?grH}wPT}r&BIWouN)tH)4V}Y3>Wv{~;C+kGKKq zlYC)`Ts(xIP{#WCfO1a#a6WJ!lpGMoukw%KTb2pB&WnZdWj{g2Hy`E(RY9t3Jd~cl z27yK$U^;y+#KsQ7A+9AMiq)&#L+V{5bAQCgQ?<7JURI|lwXoUnYC&dg||Sxr4-mjkx(d~3a<~T zVaoIoh&W}1D_1I^<;-y?3)&5D*FJ#t3CkgW#Wpx1d>i)nxMKOhQ#ep~37qA$QB?U4 zm`$09)6*`1*J~j>7*h)gqpgtPw;FDiT!T8D51{Su3{j_5u+L&9HZa;a){y?RnmayNP2{{&)STksg``ms*(Y=j89bS!QE`sM8 zWU)@~q=0O@i>4e?G^f_$oU1eOu}ln(SsUYtfyv0RkHr9&$vAqg78G5iu{+-tEjkBa z_LDT2sFH;jPC1l|vt*g>dn6U^hi;_SRXv5-!GFMK zl_MOB%z|)ChhudQKrK)bqEDZt=;5oB&4xs{f3gj_)(9FE-Wi~{>v|Xq$^x}lreLUi z46eT12b4h@bPW5!Xg~_wQojQUN$X+%NIJ9(S%9Be8_<8|!HV@eVcB&#__8z+x_{Zj ztSLj3$G3;D!DI{^4p+d>eJ!w{%?`$5W8k^l6u4lK15ve7a9^(r{*5KV{0k@`cAtRw z*CIG<^@EZ=a~w`BMY#Pv1dPMGz$v*1CP+wN%{MXpcF6^bjyi$XJUu9so&+618PNOA z6*>;&fYaoEuyau{l(d|Lnp?*)Gq?-HRAq62bRQ0w=i-EW6R{(IGETIdgO{f7#oh9b zIJZw5KZ(!4M{)*uwd^m%?^Q#|q!}2}IR=ZqK8E>Uy#=}8EkwT12UCyO*iBc=uLp z;3uNk4j0s-z43x@E55tj0Tt7>;784FI9Ke2vd_}--;rtz+9Jfgk^UWooP@ZOuX>}h z#yJc?E|z*&qR=TB#ByOA6yA<^=4s%UPJPTdHxci*DdD!9OEA#HLGuq5cz^Ot7hx3dJnS89goPKHK`+b{?RM$lvDT?LRgFer=Qn~J?1Uxz zlu@oG4C>a1VnB&94%*9L#h4|!ZFfL_odY=UD3{yfp@&n>p9kTN61a5tGQ<|CpvcE+ zIKD^~UkXjfUUP9Qxc?baQd_aTULBofSE2M1Id1AxDXxiEE|wdn;=pJN4i$D{W?~SXwWSI)k_HZet!^Z;IqjtiFN${rj-K;V=pZ z*25Nwy{P^z5wkD*asxJ1;^*HywD~d@qnk|-qBwa%J`zaN{EkG2-NOG&2{%AG1f{ zk+~VB$YkN?MbF@*2^YOKjDvgvjr}28VDnXJynJc}n%)xFB>%~P=%jjxJ)(+L_ZL9Z zN)NDSeDI)SBj~zp#9W097^k6(YqR(`xaB>_YrO{g*eQ7CQ;s7^;ds!a6QYAnakFX? zcm}6~qBjRujP!$0ksnla#i5F!FS;dX;GbQe;nmfrupoaJMzWJZJ3k-J?cD}<&b|SG zT?`m3zlqj|lJQu$4+@>T3<}Glpi<*ExHwF}uZc;>p_X84#8uE7iA8_EY52nVGM+tN z2IFNRxZX|@jfcgs-EBW8MAtygZ$JFCG#cWowxh?xSZsgMie|rxaVV<{h8Fa~<(zHs z;O|0o$*BbL>_rrhp~B+ zF&%%^@O~9);4{H@l0Yc9}^YcY;LR%QL z4GzKYg~wn`N<7@YS_)m)uY;CeHT2C+Kq}_}EH0l2pLg$sh@~rFdT2bLVKy{|K7eG8 z4mfwW03Pkw4puXtz<6f}NEtOkeby(SgDt;;oCRm}jqnt+@+f+xyj^uQo#cv+03z z_YcBv7fqDKSk=o@$rJFB&E_f73ARqJgmSxN_#Cwo+E!l# z5E8*eJqxJoG{r*~X5+XhAH5`;usTo!<;AnH_}FeR{w#$jYpmhpG6_thXW~E8e2hPQ z4VSDchBb32oUVTfO0S#)pRtL!F>(=>Us1pyu_BmqR|%8K-oUgzfBf$A99H!3FmvW# zu+RPs*DS9<+n5sG6%j*UpA5KmQWsyCFT;}SQFt{Y2)+9B;c7-C_|D%4E}sY%3pK;C ze<4_!kPGt3ZE*AZ2%Hzx*sCvJr~KI&=(5KRLIPz`gBOWEYPW-1{S^HBS{1b#SWM`w z0cV+9nA>j%`KhiLHbWC{R3%}sg9@5hB?5c#F4WInfb3&}G9e;Zs+^238lPgHbSZ3~ zv<;766T|wDskm?7Yj{<$8?EvdJ`C2B(q`U;rGC5pv_Bn2UBxo3XZG%rk6w%{=9+VlS0dJcmj@F3d z8@J3{0VWbT@Nu^(wBOwfS)ErQ^mj6}uJeG$cKhMu5@&c4Ee@;7 z;^28p4zx%P!5W#BurJ{;wK@J0ykCACqF3C5hYO>?%V7=(t)32EkzXl`h2e0wW(z!d zR1WPMi$J;A7eYTBh4_JkpziyTvI=Ej=v*2McuWGtj1;KJxd$iCKY^)5CKby0Kh!LDqm zE)l|=`#ZoQNDDvMM}g~!7I-#C0;TVrf}7$=uzG(6h}^mk$@;EvG-MGp`AOm0PJu9W zf)jTC_yzoiVUQa82g^@xhrmb2;H*j$R97eA;UR0>60{AZ)#{jaq$?k} z0PJrL=(iDkm8^uGf?RQ9=XK~CeGDG2SKx<;MbMUd6TYqV0gv!r*d3#Tn*@2jB`O7N z_E*E)`58F7N*T|Mr=#QRVf47tjVoiDaB8n3#%}9D*^w%ox|hQpF*L&39r-wO?R>nm zWHoArTj6HKa2$r3trqIf-_381o=Q6ad9v*O|`f_i^CnqYHXhw zje8!B;D|vdwx_FcHIf6+va}rI20ih5%N9J5XMk%u;&9fg%lPYv5KdNnjBIWP%3B0* zgEOVMM#p1u%e_2Y^XvlDsFdKnJps66l0bN5U4lM`rlI`7-8fU%0o`1_fb`H4Bw0)F z)0zu7vcR5uA?YfX&U%YX=tB&?nS}pV#^8{E-~!>vxZZsPcW0HO7>ICxS!#0CmwZFX z8ysB!HWtgSDWgr#dQ?%-K$o8y=wUC0npUsj-k>4INeiLfIeGMqegR!eM9}EnE+D%^ z@KHSnBf?zp(9t2-)V&@uLoM*1IzhkqaP-+}hYE>rL1d~F#@U{R!USbJ*)NQ5%B=9t zF9m#<&;aYVIN@10Wqfga7hHcOjJ$;`UVb5i^QXF^qMQom%v_Aoqz;eoRlv&cm%*|A zETjZ=L5#8_T3;0s;07|-eAfa^{`>~7&^CDfNFHuhyr+^=Zc!F*Rzqw>Je>M)o+_$# zfK(%SSby*>)wj_eei(A0+EWK^l^DUik1wcaN0dPJvmaFDw^Ba;DycE2#h{;c9NHZW zAR|j2j+GWuwi6~m^}$;dS)&HYN4`Fa^BL#4 zbma+d((^%ViT1_C3FF|DEsVt;0m$sj#K1gB{CrpfonxlppTB~0pX+v1+G~lyrzo_L zFvHT%a`@wxD01yqpj4VNhI4CSBxyOmTe2S;$0s7V2BPoPOpvXtfz>CTfze7X{#z=8 zt5hTL?u;KGF;^Ow&Krl2hSQK0ssK5HhP7|YbD=UDvE|BcTsZm*Jg+sg5d z6T89Y=2J+S>MLlr^29LrsTlqC3`R=oqV$z^NC{EE>u)Pi-9r$w4NFlfyAK~XZ^sX< zrg--!;Hq35G;6fOheNZmu+0`%xrAe-z@Xsnq&{dl?TniaZbsfwY1Dk&4tYtLn4RW| z+v+vB4e>E(byyrf<l19`?sSEgdonG)pvl)~Za$@nOF2%J<5G5LBuPIC#xT?vQq zJw_n9Ji-3S!k8N|1-qS7Q6<9^56rp`z0*W7T7b!Bz6}0Oe-A;>0Y*Q* z!MYJ8yp*hihH4++6znvA1uq6a0@WN2#-FZ$#NuBtP!I>fYU*e{WQ^0KZ3JiJB%I-IkH0-H;g<3| z&^kFE1B6b&_SC;{?$#1?e!dd*{uJRwrCs2vWs2R+`=K(m16nQn;cMeU)YcDxE?OK9 znu_DLJ>t08+zw11*TK!6I=E!%1H03ff~cY&sBapErgxTrWfLGa{1?2t6#ycRW@s94 z7jnoQ*gD}0&|gfz*dYdvTBL#{Ck!__SmHOQZLnrrHe@HRgx%vd;9ZsnKi*z}X{pRuZE9?#dVbNgsMj9F&CE$vMKWsi80L5135ZLh& z3S|z%r_U!qncD-Q=9^(;Mi*7_RtRc0QXu5I5;`mwg89iv$UFWEMmq{YbZi!+F7XHL zGEFFZW&jSyTLp85-N7yI19jodWSH&tky>*^1K8EFFkvPg_xs0BCGOQA046V;@l2al8yGL@fDZE3aCGnIKTZ%HLQ9a4b) zb&_CSG)k>ve^YuY29%{#0yR~Fg40E>DAisb%#7)#deseJbHoT$ygVA}1hw{dhrg8M zVjF1DPN9|_n*}T4^8{$hM=DV&0sgg%LuIuK&R_ZlUXGs-?5}|+75o|BK3|Gv9`1PL zez9!%?0e z+HIV`UFQ^meydjFW|5WXli`62BN2_4cEhapmyp+a8jloZqfci!%ItcLPBF!JJmWn` z9OIxWHyu74D1cp)R$$)rx!4qV8+0?nm=i%(5%TWIOFGT3xgWnTF@my0e zTwc)v{fDlCy!RF`%zI5~9Zj{O(m z{O{ASKT`vrcBtaA!6O*fBaB;=#Bifv&hGBqtr&7f9X;QAVHz@c<=1^Y@@WfB8*s+V z;X0&lW#R6Y$2cX*2JcMUh%W`W)-vPCIMZAPKNL8i$wfq8>%tIz8vEp-M|AI zuOX4K#>&eJ1-1TJfcVw;VY)sRoVyBXbybRRcI~5~MtKfj}W6)1)1f3%ls2w7>SHC=ziF<&G?wJ^3*$a8Y zw*|E+!IZ{j=&`m3`Y&CBTQZSgvgiyXofX00zinXSTLqSy0*~U+Y_RC@0xOpm7@RMO zUse#D+HecLMcllr101}rfYIxT@b5taNZ-kZUG7gn_sux`eNY97c75=3 za6j0r9DxGu>yR#_18-gjz}z1bIc)V*o|^(F`O`J{;VYBC|@dJ0}PeFyEkmgB8;S5Z-$kMN_fmR0ZUQ_LD)+dEAG9AHh(dE8$Swx z2^#pb%pAWg%!YAo7aStNsOI(<4X#Gwu1$+UL-8PdSKI~qW43rNRS26Mld$Xd8Mt3q z2R!EyIO3QF9widc-n0OZ_#B0ZMnO#E>_aQ}qcG3O9aqnvg61bpapuL3u;*S56ep~P z?9NsAZ3BaGBpZLZ00!sYf|$sIFl6w68lPA}jfcsC&I!SJ{<|oY)V5M{x{ z==PhUuL?uN;Rwp#^Cfk{^bVDmtOrBoFDNDDwbWrJ70~@82lj@GsHvXq)Po*r*j^zx z*DRV18|YffvGFYxmL&nVx4)s3TOUvpEfXl0o~KlZ!E=gls|ohTz0?3D4X>w4L*buY zRKh(8{3D(XOA0Q+>(&22Bi9DWoi9LkltIZO3iS^6!R*JYaEiiBNG}+J6`j3M+T8(n zr@q>L0H17(ylGJ`K-*08D|`v-Ce=V;wHh8w z+`>K6(SS=A|HZMntFUxHfFEcI@b33|__EUj`|3UL!W}NoiOdyL@si_hP^gu{Icx?*eeH%3-Y%%~KLUT&&xfLcEpYR6 zB}~(v1&ZRzz;%p&h)E~CVWWvGuyCLrKEO@y%5iWdJ1d|oVDaTMhcq6ErLl4-( zL@6&A!(xb9GYY-04e-bE7^wLDhFWE=3LR<96lc039C@w;wA5bknpFvfjj`}pMS!Wz ze~$%KEWU?KT=jJViWw}%iSycEs=p+ffg3s{+GBr^Du(uGVM~D!KAx}(3gx8nv4;Xa z__zQoG$fI`JOZ9qdE;e2GnBm=fb&u(fD}@h1@ck6x?g~8J*NC z@$AZO{GJhwZi!Od)TFm~di#C+7Zr{r_HCH(#hkk+WG-5on&Q1p9Imf6W+&S-tbJERk8rLR$s?jdl7CLS-_pQTAk~+ zLXmsoP$ukOwGzgIIUu~L8$R4oL3?PWvIXaX(O^UPHD?`MyJZQ1`|4niYXoS0uZH|< z1Jw4AjnFjs9{4l5sjExm;rz{VIIy-Es;9fdHjM=6>9qtimlfc7APfRj5OVh~gW2Bl zxFfq9DxKostOyIU(-SHFwMS}st^2apQ!HWw zHOd*zrn*v(9OOZIU_Tt+Dc}%{YCu*d8N}7E!Btate0ljQi2V@YI&%K-Z%PWhnYja+ zJ=TGB#1PmOMuH7LPrz5D!zDqjT&!UXHjC3?vh6Y8Cij8Vr4-1!JOLIskHO0FZdjMp z4Ld^{V6;~eV8blnEpdm^HzklTB^e&tCV)9ff>oW~pjmfM000y~hqf5xi1>r|;ytjV zKN3EBroqV#wGf|6jPwa!Ixq~rCc3!roeEky4Z@XM17P*;BSaNQ zpu){5Si~2??sr*`1eO@EVFs>Ws(`l)SkzNWft@iYpnWJCrmhmk`7HzRKOBppN)Tg< z25y1ZWMBNaVGcz6sR6e+2jE`YewZLO6%qwTnVa^>;@UzM_Rr8q{p-3Idu;{QB&edl zj6FE~%L2cDJ(Ta#J8-BV2E0@yaQ5kU)Th_}pkx^inJ(MGZ?h_lUU~!HY-M10^LJSL z(HgH?C&Tuw>Ueg~D-aba2UzM3vxld{Jwq*!qFB@{&w;@p9lXfD1^Rx+pntOtSZuBa z8G~q8l&^#jH7Go=d^bwgN8uvdBIw+<57W0y$B9*a$i9pK&$VlCu=@ur=rX~%7G>~W zpi3ARjmK;9$6$5%4%~YGD8}>p@uTHs4BN9GK4S+Yc};_euqbq0-3Ny)Qm|g|orPVy z1VOKK@S)W(JXdmuJAV1dR&0W8x(PT-?mc>GH^W@JV`%cx8T-rRkvpCS2kX;7At)UD zR2#9;b`susU5E^E$4w9J!TN5&UcWgzFjal+s`ViO8<$Tq`QM8P#m+wE3;zh@A6$8e zANoT}hvOp{^($P$kA4%)ckwRbJ1sxO&%52uKeH;DKOp*vZ<|xWR|wn6SNOP>uWwS! zAKMbe&nXa$DE1%a`xW2jN336@Q_RZf*spNqkDf^5`(*-yTQ%#=aKKL2z!xJOD8@!$x_90=z^QBq(o;vy{I;nl@$m{Bj(1?^?x=H z8S;w`a3bt9e_=M@M;g6%`VKbB%au9lDayoO=a8FdOPtpnC9jNk5KU4~|M^(Kta_nJ zjGySx*}Hm~MX_T{V_OLkZH*@dGt%f;t{)jY@M9}V7toQ%r<0jSrjnSpA^NB7bGn$E zq0C5ZGo=r4|_2?m-(bTo$O9%Cnt=y5~Fv|SR0+CteuUZyS`JD zr$vNVRpka|-iR`Ds-u?F&Y91=TKI-|pKGUY-%?{o9xo@f>RMV$c_q6ue>0nBX3Y#| zsWL{7%INy0jckwa7q;7f1N~;A7*k}GOR}o1$fk=b{LHPxM5aI z;OZC5rF=`KcJDL#@VzPQzBn;9bpJW#YoRIa)euceZND*@TYN~Dmmbe-x;WV=uE5wE zX_E0Zf7qRK8CEa1hmK_YnM2fhvNh{2>)f8iF1!;)r!NrYIjk3ADVLATaYmQOht6Y+ z#+EP|4eE^D{StCh{x5SY@f30S!6y~39oc@xd2B?RFY`mhjOjcpOv1BVSgFiM?4tB) zdScQ&@~r6vxjb}|2;CeZPi!`j{w;Cr*)mOLSSgysrNol=6_Xi*J8wv*^)GtX3|HoX z>>9@H<6=fB)t2s8yg@`Rb}=i?w9`9(Y+*l-_R&+&kR<$jNcZ&7Y@15~<8CWKKE&Q9 z>lrhm|7s`GZ1I(et5qk}tTnq#>oI|hKjhh`bmEoOL~^wY3Eg#sTquksW7l<=kT8L> zRmLScE8Uejv}Y+(|9l5&ogPG{zxhqas?T5sr?xVs+zNWo%#8F~93o4LV#zi2Y!aPp zPJV<9F(;;-BPSy=X`hH}GG(lZ1a=&vM-7x{_06Ts1Eq2%pH?CKo)|8r+e#m`dC#~g z$I>|v&yHpP{Q-Q=k(5F z2kTszEkA^r9t#6<(OioptCtdAH67BO>r2laPGT-pf1@u=tm7szH<+00M~udwaDc;*JdvG74i=lxzUf*_h14{rVUi;;m=#XGbGXDZL!H^<7SBv%Khmb- z3S`=6Z!#mznB?cFkzcp9iMv|@v(IcE8T}+i)K&MB6+icoO?D^gH@WNRy|1kqw{No< ztCM|nhQk5w(}X_y^vZlDJn{cq zkUs9XmB|yh>1Ypj(-Jni#QSv@S(h`Hj8wLA#jeg`#MUG+v5!s>*@k591O9!wP~jir zlDd^1sdQqEcbm~c_2224%l+wf1)^+puo9E{>NuU!6+p^E%ISM=bD1-~mzX)p&9rT! zB5O6fg=E{7kR?)qWJbwE@^ok-@jr|tMzM>I`|ifnbq&*(R88o0bSRS$y@zp%SVpE5 zGbDbo75%Y!Clm6pmx&G(qBUYa({g8JiTJhG^wp{Tv{F(sZ76w}xzZ-bto$KF_Hjzd zjuZ}K7`BLn7(AvQY`emE{*7kR8cq}6*(2Nqdnb{klb%f6lP)^vU^aU?+Jo+v4JDU- zoM z8k6h&h%}xX;@3?gotJkm@3qZN}Ll4ZjR z#AS~?Eg$lNTuA&%K8+d^-G^#qlllpI^_N$qZjT*9YpkPBhHj;Qv`;27Rx0F{`2?bO zqlM1Oiel#1H!_z-H3}u49ibE+d8y%jm5URjg%7BimAc zlo9dW!0aCWOy}&XW7DfA^K3s{pz~8FG1m`0BDOZGNx`iRWa^+c+1+2jYPNMVUPHs= z_`^;neUUKRmT`>y6jdOzEuXPZyvo@{xgW^>#~O6eYAwQ9n##&@8VSFqoOkeQ5*<;x zg;{7ZfxhuQnx~)K!CY*pB7WTz<1bf6J{Vi`N)8IfcJHPcb@x=>TVsD#`;Rm`(D8`* zH~xi$`(`u0y{0i5HnwE^R6Z+Cmy@F6V%jGAGdp#zFi-4wI+Jj5C*x{zgWj@#nEf2F znP+)6fwnyv$F#2IGZ7WHi1F5q>NrV~UwLJ8P1Pjw`~-)@?#Q91&zed5 zyb@=Iw`nqIf8NnE{pz_Arfy`qYAVCu=SurG-e8_<^5}W|QQF*j0v+m{z#R2XP1(9>Ngm~`Z7ud^oeCE*kT>99j zGvrv#T-HVUAsG$7!qfHoNtd6Okdt91V})X^VYi z15VVDhYxaj`kY*LU}P4%ZZv|CIBmta`*$**BqNxH9r{GN@I1TF_yvh&AJNBcrFp&$ z%Dm2}&5XC-8Aip{oydKW;|bkL=Y_R!$ja5pOp1*b6E*Q7iMfzYb`OUUw&n#JczFWz zykaStbbm5=ETzLlrMw_T=Q8N0b0nAoSizidpTSIf^@baDX&E^rDZ?(Al0u(5JfD4F zSWMHcI^p&D(Hr(TFiV`V`h(6B6*#*h-7~{L#rKE zWddyDm?@p>=%TYyWNzJV@`>^yb|J~6ZH6?7x&4ZX5Aq<_n!eJvZXF@^gWE~-#~t*G zjeJ@v!G>9GCB-~n_l+)Ha+7PYc`7k+{Z5{kU8bj5bJ^80GwJG3En;KY%$=J0fl-?f zPkIxJ=_990=w-`m=;hwIOyOrYW|iY*y0qXgv-MRqxgr=Olq^`U*MhvBa4CTNP*Wzg zq6YMZ%aV-UgG;o*3SX{U*>onwdod%SC`rELm=SU#g)Y>e#i(hvG3lm@>3OHs$jL)A zDLq?HcR0J#Qr~vc&Yjbkm=j0IzF{%)%WOGOu4yLXCxPsqWlBrlp2KKdn!}_iN0VvC z!nkbzKDuE2MrLP~EB!la9Xo#QBiE;EI$0K=PV?M2EW7>}DbY71&c!CA`av!29iGjI zO*_n-6-*@9cg~9CSTvBLf9FVqv=Z}aq5_Gl)+5>v70GJB-h8@1o{>0J{(smz(`YQC zu-}WwoFUSHz4yJZ{g{#zMbbcNkOowW1}c?QBu!)}^N@LLP=*jn=14M>sWc!eDk_Q! zsWhMGU1z;#t@r)%o{#6l`DQ&IJombvy|4ND|Ii(MAtdJJN{WO|6N86p*y@=KR-Gt; zemJcm>33fc0r^VRU%df%Nf5!f|2=v>y$UUUyAhrI7){1omm}{u30$y02;#~3)DQd>6O8+p%8@5{!?cqQqyjPWLx}b)Z_x7NC|DUS0x5`NK ziOE=`eHfYHg{ZJ+E1Get5RZVF zha1`|QHig<%SXL?R;r%)Gnp*-sZA99Ly@juJ93k6Wn88$NJfm0<7p!VTdAj!DBmqaa%%#9!pWif z?_2P*4?MEvVGT0;aguXNaz!TsJg{iOIy5)Mgu6M2h@ML>s@;4DpID`VoiwL$Vn#(| zTD}!(L#wzQ!V5@*_cXHNj{>$VbHmN#=SHEdOI7^7ct5m!+Et zC!B-pYCABmL~FDLe#KDYB)BWf(3ibqE5@bL|8=#q~p9v$sL|7b3G-+G?N#wg=8 z(VNJ-+-u~^T6bK(x(RtXo#l}HD$Yexj#P}FjyxWv;Mik-iNn5)_}wy7`mpjUl62*x zwyS2KtM*D%jf)m=BCDe@-E|%rCMIyV=3nGOJPwf=Tj!EXN$=3;g9NVZ>twp# zD-D^=$3zNJ@tv#oc+=+H_-@r?tp3Q2(;2)#s$VX}JO0{{Lfw3F{!=9W^YRw5Uvh?P z={4dCR|7HLC4t6w_+ZuFe@N;ZE1aUYfOb8;jB=7E6S0Q}(Lzgkx=r)}+0*_U{WvX3 zRz-y2;cziJb%Gc7F~$Skt5>9BF8q9C;(MYq;)Unk5hvcl0mQ*z9BI>1#A_O7aW!gD zctOuqv};osx6>q=d%x`v>GzpO+|M_lijuS3*{{-6q46y8D-t2^YOdixZZ8(xehfeN zo`jEBxp5y>PAC1ZlW@~~IWlSHQZkl#1Gm>Us6z8q(i2@pGL$Eif%WmKFY@1^EJ1ND z@3thKD__Gs{_Kyc9OJOJ+dS>~@g}M^dbnX)5iTKr(4X~xiOnA+?z8k|Tv;5$ zNgf6AiLWlBc4!CLpOuIAI>q4E&Axc|N@HA<=uZSDF2J3NF{mfCfrR>XlGR-~*g)|j z{*Y&j=H9qYN~bO0#x^LUx}+Rz(~^O$6GO57z&^g;YeDh-lepHktI6)Jf5^LEiA;>$ zK^%4~#=FF_IkPiH+#7u#bolNA?&GEg;>m@PS|xF8Z0Ls#&E&{G z!wT&2CJUJ*iE;sljd0r+eKd4@0jIia73V9hMhyRb!Kof8h=f^iYj4zY!q&UdpOaZw zTYM+JYjz9uL_bHqPB&3a?L6+u*|TJqxf^aPnoXX}N+q@))mUO{%VZ5kSl)OA1gv(|% zbL&bsbBX3kxF_Hj*K*}2$&tKG3VR>meI~~9ZhJC^i|w>N|cW)l)}z3b!g(aX7Xd>Wzw|bEMAuDBg#8YFglW_w@s7^PG zo2TfB>Xieqdsn-vwC8#*>M4($O^Qc_`kOIoQpPbg>$p*eCer&m9EtVXa)M5tWSgZS zS$XR_GEY8^v28Do()Yt?K{jtdE6x)0v&kA-e2gl?Rjk8^aZ!|B7FSS zessDjff!5(ASK|9-8H09YlJfX=blH}qN~tBjnmwqg)jOP>55mHDk5tsL$3dU6nUZ+ zg_<_6$7hXXvD-IEZiZYHF}SoFdG)N|Hr-JtAK!_Swaeu2t5u6|P)RI~balqB@~ z!BK#i1#1&8zfA0ZMILS2ltV?;OP-^cp?%w=D^k!BZ z{;G8j&ED?IbuF?dzw@kc+UiUAQr~neG_R0!PXkV9d@O#UpTcPli;!U5M%-_pM*KTM z@!>-u*q|){k5}D|PnTaL+wC^s_}Fk1e5Z|kN*^S7|hwGr7o* zVaRvEd3-yo2&2pX*k;yRysJ|X>wiF;Uc5NbvM|OMH*dz~If#h*)naiTLgRxN;ao&W zJfGIErmRgBt7u?a+ksLB1^Iyl}kF{~witkfyI#3dF!B&{={vAteG<25!zyn7@3kc8pBZ1RD-_ocb`zzmC-KOI zEp+YidnhV#5sCbM3&q;ar01H)aqrTFu)Coy39_rheu6w&Sr^C6*;j;$CeETvVFlMD zJ&9ZX%pSkb)FU~4=g7Qi24tvK51(|ma*QGM<;Lg_`Eak|eFJEpq6G1DIY5*gi_q7UepJx946j}E z3kfKfpf|fq(HW09#9?e5ao;(HX0;;naO*a*#E4-V?Mvw4z*Mf>;4XQ7qymr1*QuVm zzXAsmC-O}faLI%ouCrqYl7I0Wi&rb4U2h6FtJu>d*7P=NzL$?T9J9hxzT|TQxzo7P zUs_0UxQMHI@sQ{p$Rw|)w4o&5LVVA54!P#UuQi>$hVCqTLW1tk$7k$Upz5C-_r*(- z>kC#Tn=J&1?w5<`xAiP8tv#314&R58?-pPqp)GjBfse>8R1R;hs7JdGP2%Hdg}KzI z^Z1BI4rx6j%U`3HA~l-RuvZ$JLFl27{SyMbcfUqX^HvIoT;o=EP@{({$+dZPUHG=ljxZS%WV(XBoqeEZcB6hD@SBsO0|qHfAaUZ?I&TJ6o)(L$Dz2b+d>{7Zhzveq9iXa~H3P>8C}WlB+wq>aJk@6_7Ng;j zV>pM&q8oiqJz8gkmOUe+-r_3GnJ^W#P8Y&bDf3bM&j7sgLLO?m9)yeni;?3iJ+!T70PAZ7kaWEx*jaS} z*}X89w2NNHs+=y~duJ`TQ(uZZqCA7_;pf4(CZ*uMs{7=$fgV2pLzZS7d5oT^N|Ke* z{5sLicih*#mE>4yAF6N|!$)(HvF@?goa-xduJ%zra)0=q3uzJMlGZ#R1)df-Mpu@o z2p%9Z1`;GbPz$g7F2Nlyi^k*4FQS?go49TEPTVZjtz>=cGIAnJ8!O@+T*;~zoaK@6 zxK`{9u2wCUiQ}sYtA6w+73_9mLY65;($2 zl1uu%m~4B01`B?%Aq%7rkUTdHy!+%h{DbY}Mu#1_%ilur5HUs?^~HStZ#1{r%M42? z&!*FFWFX(LAuKf}h|+Y%xLj&ROz!T-{>Ovyk3*~Qx_wu<<&uXu$G<5!DOilQj6Nj} zLwkv%^A7U#`e7{afloxS>A;eoB(R;hM_U}-dnYZdt%vus~b31v^V~BSh*Tf}v#?YkY4kS+G6&XCAg`Ni}V4b@A zXwsVV$Suwr^`GxWyQ+-HM>!#4n0Juh`cH6l7< z!9?SNAkklU39nWt#i7m@@v6AXWctMj+~V{Vx!7CuAb?Z0mGUqP7-J6Mq1d2%i z&pDjazoW?SY#v@?(t|TaYjDhzYOKxgJ&-Gw-0N&gGc@?E$Q|f~g zmydAWQ*yXaDSdJ|(gH=R_~T*K6P(1h+gP|dhc@pnLJ!`=k;7YV@Oz|zH179w&Wu{& z%evc%{CE+Pq;;CwEPlsrJpU4{wGN@(yOX#Tj$64u-{bKHIZLwY)CVF>j}jvzf^Vo5 za zky#=3DCCYIr#y86@=a92B9^_X2U@yF($HNrV}3BMuMt9{Bi<&|&jVv~%5WRAzYqMY=t}Q|H}72YTyNjGrwa8ppPiqema0 zrDy-5B_3W#Va6w%)f7zn^VT4Pc`z3N%Sp7#alC0$82;n9A6**N!z~4^ z=uLqq)sc=ilST@)Y&UE=t_s3IP2nTLEVMzP+q<0Sgz1a!;J z6>;9b5l0G9=Vd|6Mgoye!!A-K^9(x%jUl}sPw-*g4_Nxb12nxO9wq-NCpl`tqZ1m#@8C9%6*ukGeCsoncD`D6!Y95M-wdN$l#mGtRi|Fh(ecbIXip{QD zalN7?#*&8$EUL=G*y5Xki9guNQzeUCt+A z4u?nse?vQM{!{Fq5lz~D%_k$Z(x~i$J(=PEjy$TmKsbXY)#YamvDv#oZglY|dhXlI zr3O4lk_Y3l&}23IUiC2dF=LcG(^!e^4QCMV=q1=|R~+G`SaV*LH?hp*2yXQ6d+c)G zkkszkLUQIPkjv%K*s-+$hYa7wonO6)6yKl6?oz~(0Wri(Jez#qI*hjl=VPtui6~OW zmu%nni*!C)k6OheaD&)$yd?HEmUn)IZ8hfMdV!5xR)Y$6e@zNTrOib9y(SkrS&Gaq zH^LXh-f{usqq!cMLDpq1LCean;2&!yae7Pd;_0WdXf{8NDyWL(t9^GOGiQJ5%`7?H zFcW-wLKrzeN0NkQo~GpaJMQ50Omt*=AT6sn$0_V_<)p9p;9ZNu$nhO~G)vbZ!X}5| zY3*^`NaRmEZI%|c&Hutli~r(gR(&A4p*P5Dt!X%Cp8yq<@TLv*9SEOtAzdnRZ; z>$ZCmP2z>s@X6Wlxb<^VP=swCHgCO#5@m02`)5~>1hH0hv~C=Ec6~RV@h5?ENz~yo z!e^mH&BdI^v@+tmnNP=@+k+0+k0YzqRLGH!m6-U?#UG5y$)L9dE>ymOtPe!UBxBWO zTyK4rT-YecJ)9&@eC5UP*3Xx?JVhI>v@DFQ$)1T!j)h|1vOZG%JOV#mP_L^_NQZ~ zy(`FehjU~{>O3NB;EOwTH*nt3*Knt$9FCfk%WZvE#AQXFC05jp1n(G+AI{C^8in-e z6t@br`zj-LO@gHD#}z#I{SmI)umx|qox%OLS-SuGVZsG{%hf`Zb9oWj25RG99#&H_ zEaQEUeatG4PgV~-K1;nZZj#z+ZGHCUuB{VUriqOYqCcC{JZSsuHU@ATd6W^Y$FZ7bo4PU%z6dK0ZS&c{}*V7Gv+WGe-@8=^a zHBBF1trE+A-ll$Et!aCAsQ10dRezniRBgw1U#-xqk-U>m{^}b?eYFe%tu^-ZKjVV~ zc+batwU#^**7&_BN-fyAhBwgZs}M_% z-=wx{Wiu~U-$?COgRfTpwFkT&o$=}yT;{4N@V~dxuvk4kB}IMu>nUn0`l@-3BfeUm z8U1QAo2Av&_Pvu!Ci<oct_l7M-oRy4d$3C?@nfT-d^S~_JdD76{Vpu#%3;XoXW5CbmNG8(qsPy*4X z5s?4H2wKbAsj<@?+7vknwg?)~i*THZo@}RmRTtr>x*>cT38&ANpQQb-l4!SeHJxy0 zE+`x|p*F{q;C4tXr0%#4s;8ytyCMpnp*>thfh3&Kx&*e;5fJ`z9h|uufwj6~k?`-o zxbaUR^3tqFy5bw~?VFPL{=LQcNt+$s&L0<$w!VOlKT*Z0umsmhq#~t%!FbyCI=u7i z1bmin>Ma+yp?`<@?cdf|eAdKEwIbOS_XiIn1@}|<_l{NgLhKmI{4gF5Z9v$(b0b=0 zT8;iK)yLj7L0H^t0rnrhg@U%1)CJcx9+*^W z++1&?DVRL0aeDPqO}x)iGe>W!mX=zwMvB-J%|IPP%^SU!H8z+9XwqHxG*_exXbu^k z(UiW}tRc3gM?>atoMz5q7j@D5?wY-+!x~?*y)~^`S8B>7e$h}!{;grCjWreQHfX%E zF42&11I<05p_=&AV$JOW)f&a?>ohcnpK4TRj%iStEtFPh^CuzxQ2^{lxD}ibDH9cDVhm)*Zgl;>;D{dH~1fo%YPA#ZH+RbM|30U^?hZu zq+vXK+I<)5KF)wgOXJ|VWH6ODY75(qW`oTu4oWvv&~afpG+6IEUA zcCqIteT(4Ko4<5L{9$NHXr!ht1)$ts1#-t$(iz(tsfU;}O*9Imm+dyvFDB3EqV7mg zTA&UatxmzQCNDaC>pYmXJ5jHeXP_lm1eLeMfK1|(s|$C6ina_~4U49gJvE%sf=hJy zmO}=Tt(--P=>8?HL&DI3zfDtqb(Ambdh{G^~@-M=xh-vwmkz8eKfA=HD}VekKR*v1YOZST4Hkp&dVgzZRh6#9C%MR)$4&uk~5uq+7E85 zO@7O@!S2YusYFP($wN9CzN_jO=> zF>u^o7)ILf(XmMy;JwL*&O4(|#ZMJ-S(Ov%?mMHjAbgDC6rlf-rh@5t3 zsWUFJ;}0_+=#K@fsmX!f#&9OQ>=4Wm&SD`IMJ)A-0L1o82I)9Ks!(JMHF`z#!n~QR zx+sb9FF&jQHJ?>4mWL{KkWF?w2PPXEm{?LdOIz{>jwm<4o&8P>UCx4W*Yf!L3QuTk znLn(pY=&z~K0~IL1x(#4%9c;hW;@ab=uUM;M?}r(oUX}mWz9JVs`^TI7kR^*KU!Dg}B1^zq&>6s@j2f+8LEj-~>Tqu> z7)XnP%UB3-p5;_uWhTgP{zvU#8TjscPjya5fkS-+e4Oq@r)IsN1|i4jgSsoU;Fce~ z#5d%l`G=r-s~O1twufa8d}-Ob7owz{vegLA2j|hYo#J4oZU$q~QJ{EyD}>AU!o932 z`uMyRG${qb;Fc?Jzexx>Q92zmYo;g6;^4`=4NxxZ2IC48;lq9#Xd4uO>t_?dLrxV8 zn+o_lDCc0RT@;mZk%2S45me?{4PCW4iJB-T!<0?gu>AHVsFHF7;oleO+q%H4aux41tu|rOLp#Q|XsMtJnsBut*OPfUCz&0ZYlZ%3n zp~f&$a2zVe)`Qe86~N~C?8jaeHbWqQrLCR{4^Pc!6K%s_*>ub_jL(2~@i5igm<-il z_1HGuDXe`}F55S88O+|S!=8Q41$Wb(Oto+$+`k&f^yTwd=DoMnPE8SPmrbWSs~8x{ zXV6;Pr?5KSn`u3p#Du;rWV(*x;5Yd+3okzo#q+Az)vO%0JNX6pEPo8|jZB&Nv@Fnm z6#^y!*XZqt<#5q#2h=;hhI%h^2)!W4bhlh)X*NDo{FV_t09rI+&0J1nVF>&gdQbBL z_k!#5H=K6UA}EU(F)%l_fnogti=1Y5!+R{LsW*I}@xPF>v zs{uM+4Cr$4?T|h7Bt))wLZy|uIkjgKsmqE4`fFh*{VqO0UwN6pI-hY6IZX@gB?G?>kB9iZLCE1A=SQ&4Cs#L`SpLHL*ya5+s>h!@++`U|Zff`rb|p zepd(35|LX}vfvIa^P3B28vzWfX24Mu6Iil#I$e4%8k!GJpd)E3AZp+^h$u=x^tpDr z^3WtWAw2^Mi87t-Q_S7ovzN9X<;NYx<3Z)57);rXL8gYlRKpPPc=MS0etJXGu05w| zv7f=>ZW#Ppt;il_ck*q_3D|2m6Xv&$V*{VRP+OlY3X?uj$ENq7MNU9|SRtSvD?zX! z5oYnv%j40zAop_;?0NeEhK-&ah4g~K~=1KnaV}VP)vAR%y*l;R^eG@5!T*0fX z-RU043U7jXna|Lgna>uOd9ugPC-TzQ_kh{f6lQZ$g|)j@Gp|pXkoD~!3+fq?^cA@^RB`ZJtbD;XUu-S4uJAh2ewT}nkWD7GPNCCLrn_5 z&===E&`%%iU})78u>WxcrY&Mf%NVK6)x%1l~f zm}m8SI)0%t*gbm5wF_#&`~Gao`>w=}lzTIjF_*pLFFz)* zZLtDZt<#__co`Pg?}rKDbr3hhnngQ2f#)qd!ELfJES%O)Wgo<|*d9LB(I$pv*3X1h znbVl+%{{Qa$&uM_+zy*8Cc>Hfr(uQYR%U%jjNRAwVXcxGaLitl^>*_qv!^$)w-sB# zi1TA33qqL?Jf)5I`>4fNVXC5S44x+w>2o1HmR0Y>V$>Hfi#Z(2Hh)UbA6~)&?JYp@ zL<(PhG@M;l9fkY3mmu=10fRvw7~8rR1bPbSkr;E3ZT$sF@hy;Ostf}SV^CQYz;fj$ zG85Y%7>o;tc^l@y=+1Mj(MFery(?q~H#$T39W8dgIv2WRB3aR&2#7W}g?CyhP`uWU zsr3STl}EBpBVi!i2moun;82)MX37Yl|Jz@+bqBtr1|+ z^_tF`5()#tn#||@M_ANx2rRM{*gg4hX4j#>BFa5L^~5%4sY#+C^`Y$JW6Fq29=mvO zKB&o3_T$wCNS_tWN^+dwI9mXk=i*>d6*PJ;2Uk1vX)^Fr3oXV_fb| zNZlC2jhMMEc; z@eKo-knc`8T|Fw8*UJrtw?lJ*JiIy_1kb~y=uo5|lu||~ubB%*dkv}6JOO&xBap64 z)Psp@mB8agHJBS;qi?dEAfZ?WG_|eZX~}H5a>Y5=8(j`dMjulpjZa+9^25~ZKsMEv z3a8b_E9s>?Pw3YX1#fO0==fXF=9KFYSE)ydW;ZAwP6G8?gY7xrd+TEFC& zzczz4QFGbKkfrQpZ~>jLLIOTizUNp_Gkph%ltlSMr#~?1iFf%n{UxmQzfbKHgjmQn z4cL^oi6#3kXNu=NVCdRWi0JtNjb5i9`{P0=t+1kYqEkWo@(7)n>jjZ6+8}T?4uH&K zUyZkLGW|WAi~UKu?sFs+*O?7Ha#qy0;1d1zK$|YREe?6X{`B`%4=VQxQLF7E+#1Ia zE?wJ&rmeQ4>ovbpS<4bSwe=&FOa4H;=WL|6b|%w*hCiutumH?yQ3QhxiS+(YKl*#{ z0kx8NPaDQ+xtG@~=*yg7YIo}!eXdbLUmlzaM~M>`t3C%blB#IL{WFx!b)kk9L9}g3 z7A?)L;&{VLxj#kbR5#y@Zj`a7iu%#?IeAF^rp<;gcP7!g*``3Ois{yXZScGDDSJQq z8@hk2U@^9GP;_h^Tj_Ta_Jw@~>26DKbx@(NQ*FRKU@FUQ9EAOHy=?QGtu(oQCX-s% z1?$IVv-+e7aBpV}yP;FV#1%f#_maQq9>Xb@FG(d z-swoO7Y3zlP)US(>UF>o&AG6tkq3Xx*6=Rg;15kYwX?!DOTf)d%*8VhI?nH5OMkV1 z&-EPYS38dFIF-acWcx9_KwF+~Qa@GRa-E?C`Yi26Ba@6=z}G)e{Sz%?_H+=2=dWrAZg=Q*C!2nwT^| zuXk=?ozi~rJ>V(4biGE8TzL-Z3q&DcPcWo;^wENKHJq-0AAOOV4nH6BV@StstS{ss z9Wbf{_4?zmU8DlujH{v{6Q;3_&ZP{M-=pA|K_}feq|=n!slk*GI{j=7RnB?~nxk6q z>2WXAe>0=~srvlubB_9N+rpe9)mf>51EeOqLC3v3*!@8oR$Zv0+jYd~rxYjJZaSa3 z2Dw0lbp^GFNCuNGBbHwJmv#<>&{rGs>CIV(Y0w2n2zjgp3wGwf-izz#GbIX}HDAy{ zF;@sWl0+~2?4f5}GpNZvTYjBM9l|R4cXRS9`fdG87;eg-&0WVJ@#l4#Hyi+82HhZC z#++6+`_i|M#<(T*`|0D88Z_?DHjw}72a_C~p(%74TohbK!A=9JC46X^MIgY1P?%Ko zgL*tkr=H=K5LVbt-3k)vw9+n4<9QO*xGe{h_dKRG*)jBp=x^#bdq4E?>oK}(LTNzR zG)VVJ15s`ibc_t)>>D_i|&d8L141>DMGPdF6G{|+3X8%GP zAV%adtad*I4#`hwzkg{i=npTFsD?A9jEkl8N??M~>ICmx$4vnWp0yiMm62ULS zHdwaz8+Ci(24!K|U}NJCiyNlF!x{I%;sZbT)QqOtgD>e0TM^p&r|bR;~S zc1bUTLPI@%9aIQXC-7@<@0%fLt2GrCJ4qYlXVR>9t@PM(A+|b$!Lgng&`;H(2}&7Y z>D5k;TdabIQ)8*M@(8!hA(lp?ZE&}SfuFq`TPqe#uP;0UzOpl*QfU|5Pg_Sb__4LH z(jerl?V>Fowo-#F-8Ab_AwB$>PbywqOb0bW;bq-dIyTK4%+A};s8Jc#@zI6`d5q&z z-`hYuOB5QvC_q?;1<202M680UPuKs;L*SqvIeYR2!n%cM0s)RLQSN9w`^RwX0 zlh^dyU^6}IWk!uIj{dwCcld_&->%`bYirX2cb{iJPQJ7|C2 zMw-L7@fXM41L<4K;b?yh&F^!CLvuS|>_83#R5yGrvONnRKRY?8Ek6QsG&h&IM2J6jm6d!lDyuS@qdO zn6gWlx8U=1-oB}ZFxh$@d~tW6H|It}$E{CvXvKV1XxGgu{_5YiTROahdnphzL zp?mykfT1d6JLxcs=K;{XX9m+l;Z*rpG;^LS0A4?HnAcN(w%g>ntH!yzJUb>tFw z<~aq1x2~oBDrvNGb2Qb;sf2LcPq!`Yf#u0DjE@BdwJ+hc?^YNce;31&{XbxH+)DTm z_5h|&YoYexJ78w3F-+5_g;Qo7wEUhSz4iD!-Ljw*Oa&SAYQF%-Ljtf`$P1cU)WK8C zAI?U6qqR+UftU0IVioq$ok|aA{L4YkneWSNW*nfImf`TXJ{eT~{XpeOECi*f(4pE| znETzFHtZdNcGnh2nX&~Qg-?RZ7f-{CALBu9%39Twe)p!H&-^t4PxZJ`3viD6>@6uT)4zmsu{+W!IclXmp=bN(IF;G!>N?(~73cYNV-lrseFwx?NXuCVf#BQ?-)gRiSoAnMypSS~jXq>Z+L z!l)D2Wckxt*DQM%)|yhs3;Jy8 z@>l#A&5Y4is#H#D1WE(-U^qV&($g_Cn7*Y>tM)>=e<4hi{styDf&G{z4nk_((EQ;y zJzF}19Uu0mE$f%CSz7B@fiR&}`nELgLL66-A4*3H`9Lx{CpQm1&|n1tycU4nF>o7W1%Il4k(IZ z;XPtZ_KyQwUosa~T+v`3O2pX5^ykpJE*VO${-CywKJf4Ccvf5}&i*w;Fv;6IIB{H# z9g@ERwGU0$BGU_SYBYdJk_1*GHwT)>&cS1+I@lf<@2-G-|l9)pC44%-#*87dNeU~zOPec`+V#4UR0f|~n~ z_d5-2CBMVF#8Bq{ERZ%Ieo6<`U19WVE!Y(Em{(aCIM-D|qqrUTBwT|urEVxW<^b#F zIK#4BADVLXEj^SP0|vS-U>l;s4xH+snWiz2lXL-i{#j70mb5T}Nv zxxo9o8Ny=)*rCciy7~nNxu4^ygvVc~?F^^Gb0YZuBbQFBXalYAIWV)@0Jc;v1KqHr zaJKXrRmX`CHBw7emu3NH9RwP`zHxuniPIBH7ju_=a_Ic9UQTb|Io!H-5xPpMVDH1# z&=o06pL~{s40U^2cr+i(#>K&RBRh!1N%V_)01S@{r4tA?|MgSw^vQK5vbY`muSK&^ zv2IwpXdP@gB*acTW-!%#!AxErcqwJMKx5NcNFQb{J07x2mRDdykOc3I8095~E`=2< zHbUvu6SQr496UAsL+{5KvMEnLu#Yp&u!v*V*hVoAh*>+rUL-t&h?8@9)t{#G-Yj3i z0^=93pQ~>$PH6%gneYvY`X<4gfBA6QyB<_lu3!Q?&q0WU6YKMs&g*$E$Gr>t!#O0G zP`w@I)K{88$@F0A_x3)WpeaHhSGUq%wWsLxz0Nf9^)%Yjp3lWzWK{3yDXJkIOn<$d z06)4`(T>+u^i$t?dQ32v3JluQL{0)MTofR7LLwDZv!s1bo4MbDPE^0slQxTwaBJgV z)6NNjRJ!>!wG+0YUdq2{(e9^Qfu8{^zajw!H*M+dk=?XW{VL`51yg?uA)29X&9PN# z)LN>E`(LGfc|28J`#w^ps3c`5%30UF<50%XAeH8UCQ1XLP#TmbsgR73C>f$eh6WU& zq>!RXktPi^D3u09lj?V#p7(tmeS5#Z?^}PK&vo6`x%b-lTI=3x-)rsBHy7}RKbpeh zTg3A`Tl%r92}5`-y9#-qlm)q;;WBnAasoUaZW62uUuTZH5A)RT*RY^BTbQ-BAYbdz zg)OX=;tkke%X`0T53>tg!;XBPhi$d+o_HU@^UAI#ywbv5%;B9jRMRi>?D&qn z`W7YLA}v#mt-CL=#AF3#Ha&`|SL*ZLd#+{LD-UYS5Z}V?576eVD}AKlc;AQTeqsfi ztlfpl6=$%LrZ2n?`krjs;ofYO_H-tD-+@;dx|5kX9A^FU-}Cgl-_iK6P>c6Ys)*-2 zErvJe0kM)A4`#6qtijcSZM*zPW5w}ARyId)zk|zJfA?^dxqVWj=Lvb9$74D6_{>+H(PS~+fG+xsQ$Ea$v)vdij$~tMeAu}2%h=H1N;thR zfo1<>be*8b!a6NL*_MlJSkMT(&5dQZ-YT)*rOy_NECOTl$-es(H zxFSrRmLUF_EzieP3ANhAtb?uu)Be7M-btT8TyG`X%nfH(tG>WNshTb31!1O12SnMp zu&2)YSamZC*Gy02b4NG&RK0@jKXwPQM@OM>b7#sIyk{x>y?VM zmIJ4z)#`qX|5~?I>&R?J{?swOv@VSt%J-T#LCa$y$N%tYxK@4l6Plk|t+iP30KTK? z3$1{bRKB6zGOevD1Nl+cDzy|24CIR@8fkr>=)*V2jN|u^u+bWJ=dB~N7U(KyRTu_qWnZk+dYq!DrMyX;e{FLd|3?G#{MV_ux&!~aYQl-G zvq+HJk(Emd>=Scn;*~V=_SU7~5+BM+zfKc1vXGZMolZWThN|X7a(?JeQky$-A9VFO z6Ws`EURy`{?zI$mI2x6*(`kgcGNr0@q3WzaN->{DgWu=U=J}K9O|P@`G<*S>@UP(Y z!R5%PpGxM5J;}x65M@1**z*k)kwv!1cKut%{AL zC!cq*6;^X;O3xNv&f)}GGRBO8UDY`|s~KF};%Lfx+mVY@%%fG}>M-Ej(lF&3=HLA) zp1;^eX=i0=Q|c?S@6w%)t_!1X_bjPfQ76b1eql0>se+8M1rHieQ`E;t)a^wlPBZ8! ziticGiG~pBe=e8=-<9Di7Ruw@gi&BuFEGjPg0>ssMH7Y%WBzYsss4;CNsQ^how9CZ zHxG`%P4}(1e##0Hxem1D;6B7ireI_ITa0|BkHmuB=(EEE@vl_zhyvlt*+ccF1@$)R zMbFOoVt&sClpgL+?@#B!>ESeNeijBht00K&YlOy_uDHw?9lNPP8z#k|dlz2}S~D6e zH!Q)1z~fMK-w%uZeW-TY1B_pE5AiQb1gn<|v2MaG6n6_khmS+ZT0RNqnQtOC{JhUNm|f0>JFvlA6T{*c_A`benG|v}Iw$U5??~%r#6IRii}FwR5Rpbyo*j z2lg|Yj;Go9*do?B^J^i@+(+={-CmFp4O`CyN2X%6trkv; z^`M1IR$-WDAbY#piw=3Opo*7-iRmNA>2eUMsGen{*OP9}^JTK#T*>1tqx8z_WGpYm z=}ekNkBpM3q9%z>+B#x7*Ml^RR4`%dNh~d!Nc~GbKyhshB_4bWmBA}$aDqC`+0zL# z`7JE!_-=TOslr05K+2aXq%)=mX@P|Z-7RXxRwGw(nrJ}YGMZf0OjSgCj=&01!->+j zqI8yFNw+4n$ zk()f+jpouQmrS;yB!=FsG$vg;HBK+plG8JcpvU(mIq{r4Vp+bZJ2{iC-gbnd1Dvz#vbR@3Qaow*r9ISR`( zrtyn{N$F@HJ!-M%iq1t~cycIICJsaW5KV4^&ssX1_L9}qDUz2{XPS9Pgj?+50BcQ- zxTj87ZPuS{4A??0m!j$L6&(ba%%i$1`P9#_k|nL>Q|E;f*yKC@)Y54<9hp@}BpZeK>dzIqtSD(LN2{)>HCTr+SqspU(ZX^<_|&CYqkZQlQ8B6+j3Bl9*Q?x>X}4x zBX#>Whja$*VTM~uD?1*H<#K9l$%7jxy}lh)$Hr2>iJM4gTshA7k|BdLUCCj8DH}2^5XS4W*^;3= zya_mksbwSZc}EMp8HV=bUV{u9$jais(XAKkjW8*Vx>={>&+ystp4C_eNGb|BM zw*q;GtC3Jxgkb^k^zHZ&wzs;HX^lC^#IG-+6M=^@h;PJPb$n4)HWdYLb?D&fES6Cp zLGw);vG$}WR`OdZ?C^66+7OS}_~Z0Nx16lb4MPvzSel^soF$*DC6|Fdv~kI7u5@Y` zXW74kJbVUoV^($Ktj=bm_}DJ$sF{MmXP{)WyR>JX4P8ys;o`e{Q_80!bk8-G9Ivj! z`>p;M)zX_94ad`|dU?*8Q{ik*jpPQ04X1B&H+2%)~=e7|O9-YJ5h!U7| zKZLqTgAtTBAHIGif{MB@6nM=>?W#Uxug^#~+Z#{W2S^v{QTjA7*nZML7qf%7Z}F8K z+4l(FoYj%qp$Qj4O{lbC1oa)V5{U+;s9i7y^RAyl%oHC~kO(Osyn@KG26WMlg;f_z z#D?xe{+x77nLLs@(Sj_kM2j+pfq2C4sT4QstN-tcx%SpIzJH>hn9nFGels_9U5r7 zjOO|%LHpb;T6Cc+`I{!vlzo9HTvG#mWg{4W9>a#JjUrp`J~XB164Sr`7E^BZrWEDn zZ2#U$EL^{i_0I224v+4Ddy`0^byZ}N(~|~Wa-rk_gX!i?cdV(q3%{@}Y+UIM3^tP> z^-qCNe?6Pz471SsvIQwqAEFD_$g+Kov4?VIIK9FTL3MnZR=1W$soK%0)3VfadLCAa zt5S1p7joP6i8k6jWBUj5Ff*t--d!uDq8lGEK=4rpsAog#;vV#@@}>`4{8?y68=6oY zfuw33_H0xxov4c?i{c+>obk64_Cv*e5Y=E88gsdmCr^usjxnl%<*Bu41}te~gq#5xtW9XnWBaQaW3} z9P3}+nA*#VjzBF0TNt0PhSG0^$oOc8g)P|~{zp9MK& z;;4ZXHTe-0>{g{c-}h7QYiCLm%)eg*)p7neP9a&ZD=nT_N}9uExR=&q-1S@E1uM-X zC@Jp%b$lOA+IzNg=gPa{smeUmxqf4YH%D-%8$;-5UIZ(6Zccm5`cj&lBsaHLcT|r% zjw(w@JnbgS^gMdeZ50hNx|_s~pZ^H&dP~wYcVtVVbMauR0TUgoK#I@nVAO9t8Kv%{ zr)eTY8D5ymu7$q$2O>Cs4DDdgN@m_kA% z8?rzFY3klMCd<);=ianDb0Tfum5cNzyV1*6jdZ?MV+Q{!Jv7f^ypHdfXZa;|s5FGs z@4dn-`#{Ef(1H;np^$DJO&(nivezb)sQh*)ntD!R>xyy+Clct+rXJ8OSU|@$18MN5 zQ|#70E9zwy!g58T$Y-k|?OLhKEs>hQWiJgSp2=5gl}x9!6}wOrZ$)R83#tnHyutzX zU{a2gp@No15=rPqGFdicHhK~r+1(q>u{?-arQy(}7ObCKAc*f z+NW(4UhGQ;JnXoISG#3x%#G{kXPRM$0!>rfYI4bf2krCS= zsk9O;Z;#*^7b>XEU5LFt>a^cF8cA;sq2~Q4l=P8Dk=0UUiPd6H%X!EwzJiWRU$aJx zASo3;LGJ8`IqU1Oy`vjSzHf(j;d021osD@_gD`l2D2aQjk^9D%xLyAQ1JZB9;Kn30 zetv?$rSfRV_d|$&8m#4Bqu60ORXo{+MRzTk+4JKho*z#de#+>)!Jh1I?ItseQg$P9 zCP`i}W>@6)(Be&_Xr8|k*MHOmE>3bMoicAGZb%kA^d10{q?y#+Mjp?%-N9~&tu*ti zJoPueO352!NZ-Vky6l-m+tnHB!oRST#V2r0Fos$BWzgHOMk+CQO@5KN=zU9{=;bz= zd^mtMXt;BkyVP)W$7J*x{+Z=;AHc1Cvzqt=V%aH0MQV1DrIftSw8d8rOW%ai<&$+t zd05Bnc%q!o%6d}V=!>(~C#c``f|fN-r)Un`z>|SAw_^gGo*PA@$9dw5_HMXL z>`dAlC(-6FGFojOq_|x4BQ|PJ_ah@Z?(7#j{VQX*0c})uPY78jOIS2FCF}ko>lll}?qj*>- zWL7xhS@<@rO$XdJyzi8&1_}W2`)O^rD0Z^TVCqIanPqY)J$^cj);|;DtDXW>lP34*el3?onNrpCH3r{ zt)My@kC88PfEvml(gDd@;Y54%8L~`6!EeH-Fjb1dabVndCCYhJ6Pa=+Y7ejaUm4Meefz`F~ZX0al0WF1v8&B zy@*Lz&}%32j0i)T>>Nml^(4o>y(l^~0Mn%kalG*jOgc#52v1Pi{c<{LzV^Xo_gHw< z^o0MYd~|wQ2}8p)L3P_a_&gSaTG@N%TI`R0%Pn!M`8b|uy@b?;bis4RU>q4Z1fM-) z@%Cjnc3+uH2R7SdyrK^FWr$&zTQ72y^Thg~2dwtR6lgZ6LgB*;RIM8Y4+|->GBd%1 zS{b%tt_?l#UrLV;eq^(+Xwf~32-)C*WZWVx!drxtTIYiO*T1u^hGsW-;-FmuXg# z4#ik*WS7%bNo3FkJl+yXIksXraPAUJBuvpuD~QFq=~1N<(TLtt;Z*kkiaqCtW- z-l^zGYx}3bqMI|7S5zR?vx%v>Tx8iHwwN}175tpdX>gJgE%)0(nMqw~)8-6Z9V<_= zUqmRuw1x`L%tk@&SZsJ9m^YssqDNj$P>Hy~#Qlok=C>VJ9G26XyjCWC?iRCsnT=N` zqoI0Z7p!-DXX7-aDC4a;^psR^X52>fpjH-haT1P3JZ5hKy1~0R4`*DrV$8WFme73~ zYJHPoR~C%ong^_l>Im*8cIG^ijLDqp|Av-@jkeHLu^X%2(a_>mYe>LrHr zG%@;t6V`v9h%ck$F!^K}ihJ~eouLLENm$`-r8{y2_jp)EAzqdy;)$XQw!FBoSP$f-g(BBjvkAVo}y$uU?%j_ zh%PR_iX%-Q5PQEE#o1Tb&cJLoz@pSu=F?Ci6hsBmXC|CK0*5jWL zuTnwBhCgIQQ6gxuC}Qpj3G{K$9rTm4X5X59p*h+Ik54S18AHcZf*k?aW z$~I>=s`|5j0hR3evQlQ|V#EyDX4cPgAS>86l0_}r!}{0>zOGjm$~2aCL%N{i1(yUn zziLz2?yrih$+jok@7=&QlnrMGO0F;^XJw`@uE~-+R-aJO2h&EuIFcmKJo}y9}O3I^eas z1C*bs!`jvpQ&klNBjrd;F*y1I%}Pjkza{(P@!4 z23{Wom7_#Gf?ka)#J~1Nt;IY%UlM@9T~&}cT^+i1 zZ`h#T;m{g0A77LWVbXsNMn|iIGc06l-Sp5~Erq2lnF;e-UC^of6PT*Ef`8c(n|d69 zSJyZc?5bstMEk*eR&Nw8dCBzldt;tVGZQ->2g&!&(6Aqcp^G@^j2BdVrl&Ilr>Qu3 zPaaMAahPZkgOX=S@Ok--Z4vC;`KD=$k2|Npd1E)SlGnoMGI_`?e#QF5T*b|FBTNeU z&iHpkQMULQqlOIVJ^93*tqI=v3+Uem7pWJ%fd+J3GJKKgI&U6X64(U$PwpU40uwFUmqcdH3u?zky zwb-&DMP!+mPiZ_3V^(jb)$7wK^gxxM3VkVA?OVp=v<_26t|c9nB+lZ|eD2$|ebith z&s8qIK*vLEz!zv=Tdo4h+PCl+5Kq^)52T4P;@s3iRk~ypN+v1}WR#*L$XhiaONF=- zCr!_H-X`gLpD6!WFK$XVS$f-L6zvi8=Ym(^_YCvH`_8mx|c)0vta%-fmCOjlOWu*)@6<=}=>`LXoS^D#YWRzyVy zAG%t8l3fTdp$T_4(fU`~-1w7D+~cN9YRXsU6thIQ!W~|M=R0qzGj@S(ZdcOidWd?Q z_8_gHGTi+U1L$1JF&bX&NoS--V_W1z_}IU|>gAw4yWZ2bj!N7*5yr95PP9y8I$ek= zq74Pn^z@=XcRqFwqSkB!d747QOP?E&xQBW`88L!9;1Fy;*#ngDed<~YIigGNb0 zYcyGqd#;@94axobR5B|L_sU*DAw`x4=ic@*304IC|I&`2*mdST!L?;G;C5!QhW zO>W_c(JrduWl+`JYb2r2fZP=-6s=@K)st=LsGA`tr;?3>>1p^fb~DC=N^;ImN7C%! zOR*{ACXOF^k5X1nMJnsDO5X#kKZ!y$coAD(n1hPb!3f~Wn7xfZT)$-FVd_ja?ZH&c z)6!tt57KZg!vldmlqgMgIJLy=$C#S4$lywFdE`cB_reiLd(Jca21Nwg`U$FBr69F0 z9v!8JK()#j-kdkwKka5)4|ZhJUk|`L{k~w`cR+rV6kWTUi$_N}924wr$}o*UL+nnR z>gG)z(_&b{s&u9}ZwKo%cshk?`J!~@1eSHQJKkrR;C=cBY@CtEPE0Ptir9GQYm7iP zr%J}EUva5?Cw!kv(G6yEDkW8=Er$dB8J+zLtZPuL1JxhI+T%*N&7Z@8KL9s6x9kaRwaiB7(Yrt)OW zT&F-U9T(HG`vYj-*FCUUmWn1$n!In_g;(n(ij-f4!hAbujGvEl^P)+v=qVO_7zkrt zBI?A_P*G<|;SQS+y)=V&pfQ;F-J8oCpW86+Tf^C`_3}7zAe&7tQ$s=ANM=4nPjG67 z5_8Y7V*&5>Gw~TOm|9X7Bpk72yd_7Oo$@ZYjPA<g#oT-g-8*^B-%VS(nNPuL( zIP|YIrYUoIDbv}T)iBH1Lyw{_QiY`o-5VcD z`$}g~NvbtE%y^215W#c0+cpg9rAAA;q+#LYK$J#vM=VgC zh3KGYEDTS?IgyQIY2YEqrPe~Gj}?+1RMR`VdGnzO@5686KzVGU_ysgOYkB_l%~qZl9%;kwr%NB+}yeu>w<=1nMw^>X5JL+ z$m~E3mJ(DrJBw0wCn85g9Hts_cz7rRWj;Ib^12c|v0Y0l67pnz=mbPwIzdB2p1f=i zV8@%iWMZ=q?>%iXTU8uengvhxJ-m>^g~8 zV(v&wqvp}f`@w9`R5glfcA__r9GJFIXNuaM!JD{y8V$T8Sbx zQlI5ZuDHis^rcDR#BO$NekhE@4C&dl`{;Qol&t3*!+p}B=1G!NIWL7d`6e>nAuE_W z3*tL=4OvdxPq8HjNN}nO686>OK&s$bH%pTq`>Sw4MM13dum+akAH-_RZ&Gy}M_Ng8 z%)RwJI*d9EC5gQh{O&M2pE3hq%cr3zQy%9>=VI%iP;7}@g$GAwp|eF8n!mKL`>D2A z{`6#;mZzJpW^}=E2Uhw%g;^)T$q?a>Sl>2AAHI2aG(uv4h=(b zCo3wOycj_fOpvXjgx0XW6dAq{N>virX43`kclsiuOpHD?^@3uNAr0BE7!T76d0z$N zLCW;)= zDfFg738k^dq-Ao0eL9*CWb zB71FPN%?DWb-`fBe|(2|KD|gWWHszu(oudP9Ip4@umm*|EO`HrE&L#jr@6Cndfi9C zJJLuv-jIadklBzB+^Zc&E;6%2L)l|HU96naFgwaCVf}* z-#G^cbB)QwSQ^Wwh{8X=mQ_sYPPr~4V6IxlOty7`uYG6ietQb3>4zB$d&6D`c7tDf zYs{?uTrg*$5rUEu1eJ8s*i$kHHBb68C&4qtF&D-pN(t9@e`G7g^3cKl39gl@Lw%wT zTI-zz>p2z7bNL%~`L!(zwz(u24+U{>B!@{&-Hz9t#n5Sr9r9O8qerp>+uP58eZH8< zOwI`^@xmwK@bE2gQuIPXm@$q&s$yXW2Oxcm8bUgLg}2lJc2_ZxS$&CNHkwxvbf*Kh zKXPYpWgA)Ew`0t;W*Y+bS+L~u@8bEFj| z*WZHL;b-ip4k1&i+t~hWxy*ZP77?TLDYxj@sbj3nSecxc zSz-C}3%qXk0%^;77YZ47jfu`yr)5nRgp7LHp65*F?woy0=o_3_0skB-#Sc^q9?GLgQ$)Zs2P*0KgWInBB z*=OLp&t~imm7~Wg72scJhWmw7Y)Wdt*9vPiY}${-dj>+I`5HRCPlLn^TN={hL&{=R zxa`c)^6Ea+^Zj}x*X_ah#A7fPXvI&t0e6Gdc%jyh)(K9&dT?kidDdm)$kmNdeAE$< zInNO1ya+ip-{7jGPLoe-klL|VNb0{E7p+d9Q0+9%7)MgpkXN|oH|0)~=3c-j-hkr@`!o zY12D4Y~)3Z^Ylj7s$|>^nuVB(oou>Y0Mppl32#sLfoAv#_*7oPQ~N8Jr5c6Wak_9> z6$uMvPfTAvky543v1H>aHh4oGd+?$!71_8!`_wu%-&_y73p>N4M-#$QqnYX!Yn1Cg zXDz)ZFmsg?IKYnLWNQh#z9I=rA6|vs3J2EG$pL45doj(_BZ%1L3ExT;n&@ptdQ~wP z*!U9p>XP(HB$w5$o{3v-C2Xd2H>A`h;cn02IH2?xXPVc5yiR~~SuM!TwzANGt?X`B zCG^cOMSkiXv~24_Wsh6nbyOaufo9meAQ#uo{GcGQlD0J-VtIm{Fs7U1Sn8mDwCsEs zmR<5<4}&(M^^2xp8`38%3n^huW1}eY+F9`9#v8%GyE3it$ZE-?%JkfTKKQO$!Oo~TFLK`qNsiD(I)=l z>?Hn?ECYVX#)tgfvvT;iPtDQ3(A`(tJF}91C4P|h)`7;_M{cj>FD&27e?9abzvtBu z{@Lhe{zSJ-{__kS?WXB6+VAZaYTtG&;6KO?;mg$z=8OA?YkTkU=d1OR*B&v@Kzme! zfwoNDOa7AlXuek0I{wW4_xSg*Q(HenO4~y348PnboS&e-So>&o9^WfvE&r%zHh*1= zFP~R2Ogrn%xu5C^b^i}_h5tG~wd{7FqxQDOjoN;)sr=8IinYT$nzaph$=avSpV01e zc%1H?*Xr8QR@K@aUPSOEr8??7Jv&bK@(nE=`wwSyq+VuekC&OQ7 zcTgMtsRxFC>VeUpdSLXY9{hc<_8-LLpg;BC@58D8zysqy_2BOlZ2!Q6zsvT2L!fv2 zviCnz_|4(%A0K{ugcVZwO&|WD z{?LQAY34UQXq#sKOM(Awn)xrK{vA?n)68!R{9$vpO*6mgLEAL*n*wdq%x??)VH>nf zGr#FU+cfi=0&UaGZwvfk8?;R`zv)5SH1l5y{4+rR_V_BK@SCmhkHT+{utEyI>4VC& zRqh@Rt32GD9H%d{{C6rlS&-2VA0Fuy$vKOL{QFeL?09fBn4> z)cYUk?`so+ctX%mR$Bi+e~5>u5)RlOR&_$qPgc+VfrJD0ht+E#=qIa| z|4+dFu>bmxy>P((1-Xg~5efJ^GU^38TUx z{KHnKJ^GWap)e{O$Ukg{v`2rk9Vv_ohw~5H@$J!{Y_0x6g%%Rqg8GNC%}?-8*7MuJ zKS!JE!k^%utlj>C|DDLS&0WGvP_C=mbN*8J`7z4XQ<(F&6aRzb)1LE7oj_quTb|y| zpY82Azto8m=Cozo?R4VXbAG9l{1@kc%bD9L9uih;ON-lajTZmT0!qx!0caOP$BUoVIkaoz9E)oL}lR33J+#zIHmF z+H-!XBO)fayZfA&b>eAHE=J?Gy#?Kqmk zoHmEradg{reyL+D%xUY9?R3oAbAG8aTA0(;BirdrYR~zl&h)=H|67l2r)Vpz*w!Q4 zaTc`a{PJI2ggI?JvYpQI_MBhptP$q4^~iQQ8{2b!spBWiY3q^gbVAy5eyI~7%xUY9 z?Q~+=bAG9_PngrzBireuw&(m(C*v>9FM4DB$q4WO$ D47zo# literal 138802 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

    ~$$DBN6chL7B4(aztU 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 Qv+{RO_5Zk=0RiLwKg%|Hga7~l literal 66915 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 diff --git a/examples/pipe/output_pipe/checkpoints/latest.pdstates b/examples/pipe/output_pipe/checkpoints/latest.pdstates index e56a0ecb96454274d99c44cf3115713b3ee3f773..01dd31eb49cc576ae794b43e80f88132b8ff8eae 100644 GIT binary patch delta 16 XcmdPVWoclUsx*;Bh1GWlcc~r#AOi#n delta 15 WcmdPZVQFBQsyLBFg~eN`R1W|euLETO diff --git a/examples/pipe/pipe_post.py b/examples/pipe/pipe_post.py index 455ce3f01..fe0a73c01 100644 --- a/examples/pipe/pipe_post.py +++ b/examples/pipe/pipe_post.py @@ -113,21 +113,22 @@ ax1.set_ylim([0.0, 0.62]) figureName = "pipe_uProfiles_nuIdx_.png" plt.savefig(figureName, bbox_inches="tight") -exit() print("Re is", Re) np.savez("test_Re", Re=Re) plt.figure(2) plt.clf() ax1 = plt.subplot(111) -sns.kdeplot(uMaxA[0, :], shade=True, label="Analytical", linestyle="-", linewidth=3) sns.kdeplot( - uMaxP[0, :], - shade=False, + uMaxA, fill=True, color="black", label="Analytical", linestyle="-", linewidth=3 +) +sns.kdeplot( + uMaxP, + fill=False, + color="red", label="DNN", linestyle="--", linewidth=3.5, - color="darkred", ) plt.legend(prop={"size": 16}) plt.xlabel(r"$u_c$", fontsize=16) diff --git a/examples/pipe/poiseuille_flow_FCNN.py b/examples/pipe/poiseuille_flow_FCNN.py index 3081bc4ba..66e6e0395 100644 --- a/examples/pipe/poiseuille_flow_FCNN.py +++ b/examples/pipe/poiseuille_flow_FCNN.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os.path as osp - import numpy as np import paddle @@ -125,7 +123,7 @@ def momentum_z_compute_func(out): os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/pipe") # set output directory output_dir = "./output_pipe_1" - dir = "/workspace/wangguan/LabelFree-DNN-Surrogate/net_params" + dir = "./data/net_params" initial_bias_u = np.load(dir + f"/bias_u_epoch_1.npz") initial_bias_v = np.load(dir + f"/bias_v_epoch_1.npz") initial_bias_p = np.load(dir + f"/bias_p_epoch_1.npz") @@ -365,22 +363,13 @@ def predict( } output_dict = predict(input_dict, solver) - # analytical solution N_pTest = 500 - uSolaM = np.zeros([N_y, N_x, N_p]) - dP = P_IN - P_OUT - for i in range(N_p): - uy = (R**2 - data_1d_y**2) * dP / (2 * L * data_1d_nu[i] * RHO) - uSolaM[:, :, i] = np.tile(uy.reshape([N_y, 1]), N_x) - uMax_a = np.zeros([1, N_pTest]) - data_1d_nuDist = np.random.normal(nuMean, 0.2 * nuMean, N_pTest) data_2d_xy_before_test = np.array( np.meshgrid((X_IN - X_OUT) / 2.0, 0, data_1d_nuDist) ) data_2d_xy_before_test_reshape = data_2d_xy_before_test.reshape(3, -1) data_2d_xy_test = data_2d_xy_before_test_reshape.T - data_2d_xy_test = data_2d_xy_before_test_reshape.T u_pred_2d_xy = output_dict["u"].numpy() v_pred_2d_xy = output_dict["v"].numpy() @@ -398,6 +387,18 @@ def predict( uMax_pred = output_dict_test["u"].numpy() + # analytical solution + uSolaM = np.zeros([N_y, N_x, N_p]) + dP = P_IN - P_OUT + + for i in range(N_p): + uy = (R**2 - data_1d_y**2) * dP / (2 * L * data_1d_nu[i] * RHO) + uSolaM[:, :, i] = np.tile(uy.reshape([N_y, 1]), N_x) + uMax_a = np.zeros([N_pTest, 1]) + for i in range(N_pTest): + uMax_a[i] = (R**2) * dP / (2 * L * data_1d_nuDist[i] * RHO) + + # save result for post process np.savez( "pred_poiseuille_para_0425", mesh=data_2d_xy_before, @@ -408,3 +409,5 @@ def predict( uMaxP=uMax_pred, uMaxA=uMax_a, ) + + # data_1d_nuDist = np.random.normal(2e-4, 1.9e-3, 20) From 774d825678ac51426ea437077d13fc97e4d38f0d Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 28 Apr 2023 07:40:48 +0000 Subject: [PATCH 04/31] reproduce aneurysm case in paper 3.2 --- .../data/net2_params/bias_epoch_0.npz | Bin 0 -> 1218 bytes .../data/net2_params/weight_epoch_0.npz | Bin 0 -> 4494 bytes .../data/net3_params/bias_epoch_0.npz | Bin 0 -> 1218 bytes .../data/net3_params/weight_epoch_0.npz | Bin 0 -> 4494 bytes .../data/net4_params/bias_epoch_0.npz | Bin 0 -> 1218 bytes .../data/net4_params/weight_epoch_0.npz | Bin 0 -> 4494 bytes examples/aneurysm/main.py | 342 ++++++++++++++++++ 7 files changed, 342 insertions(+) create mode 100644 examples/aneurysm/data/net2_params/bias_epoch_0.npz create mode 100644 examples/aneurysm/data/net2_params/weight_epoch_0.npz create mode 100644 examples/aneurysm/data/net3_params/bias_epoch_0.npz create mode 100644 examples/aneurysm/data/net3_params/weight_epoch_0.npz create mode 100644 examples/aneurysm/data/net4_params/bias_epoch_0.npz create mode 100644 examples/aneurysm/data/net4_params/weight_epoch_0.npz create mode 100644 examples/aneurysm/main.py diff --git a/examples/aneurysm/data/net2_params/bias_epoch_0.npz b/examples/aneurysm/data/net2_params/bias_epoch_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..795af420c7965d6b32b3b2457bdc4b807f349e2f GIT binary patch literal 1218 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 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net3_params/bias_epoch_0.npz b/examples/aneurysm/data/net3_params/bias_epoch_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..f6d213126b5507df53a12cdcc3eeb9670a9dae2c GIT binary patch literal 1218 zcmWIWW@Zs#fB;2?#gawF7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl5YBwcFf6ry>D{yF_UpYI zoIN&E0`vDgI>BYVX!}wdzr@?Nd<%Z;2~LjPJ3CTyA8J5sdo%w5YCsqb)_@3Iu4Q*) znUURu`9^zZub;E`@fBseMSmIX0{*+~J88+jFZGJWKBjFPcKZGjb|SYG_i-!=w{3U! z-M6GZVDGns^0rH!1lUbc*RU13V7V`v@4#NvfN0a=RcHaGdk}_X4P#h9fP_E*MpKkE z3@ObS3S1^7A;4Hj!}AbkTU#lQdng-Id$ literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net3_params/weight_epoch_0.npz b/examples/aneurysm/data/net3_params/weight_epoch_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..90106819f3ac1c9036f2e28cf7f496c930070e21 GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net4_params/bias_epoch_0.npz b/examples/aneurysm/data/net4_params/bias_epoch_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..9ab6f005808ba1ab742d685945a8752855a5a591 GIT binary patch literal 1218 zcmWIWW@Zs#fB;2?Sz7v`7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl^|lG+NZVPqHVU0?mo8%;dY!%B6hK%Q}?}GEwk@6-)lRm{MU9Gp1S+4 zKH}c5ux*i@$GtOq^WU)A-;!srKU;r#pM~CveVp$Z_baF{><>T*h@AA~FQ@@wI9LP1 zY8&6av&Y%(I2ph0ez8c`wofW}-~0*Xw$@8KZDrIx?~UBN(DtY`!(OGW3bsdfIoW+n z3g0*9Zlc|pHuZg(UsvvN-oOYH1+r~xtQ_=IPu0bw*)1LD91yM4bq z-`QT(nXq>=6W_jPl45oX_UqUM^Tyh}T5GwlWJ`qYnlsP$_U&`GJJ}><=Qwlb-ucs( z?D_cm=brY3<~EW$CH93a3*Yy;VeQ`8f+>4Z10wsA5NiuC-GeYBYZ$`<0we?iFq)#Q zVMuAtP~fsSaAJ3WHzSh>Gp?KsaW9B$U<8rSe2%UOH5Y&sLO=r}Cs12bJUCCFYeG#i sFfAaPgqT2@!088F6Kd!pYm#OLX#$6JfHx}}NQwmruK?*AKq&?W0EogRB>(^b literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net4_params/weight_epoch_0.npz b/examples/aneurysm/data/net4_params/weight_epoch_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..c0c66eb626c8a361ffbfac13b14edcf1eb539613 GIT binary patch literal 4494 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 None: + pass + + def __call__(self, out, input): + new_out = {} + x, y, scale = input["x"], input["y"], input["scale"] + # axisymetric boundary + if next(iter(out.keys())) == "u": + R = ( + scale + * 1 + / np.sqrt(2 * np.pi * sigma**2) + * paddle.exp(-((x - mu) ** 2) / (2 * sigma**2)) + ) + self.h = rInlet - R + u = out["u"] + # The no-slip condition of velocity on the wall + new_out["u"] = u * (self.h**2 - y**2) + elif next(iter(out.keys())) == "v": + v = out["v"] + # The no-slip condition of velocity on the wall + new_out["v"] = (self.h**2 - y**2) * v + elif next(iter(out.keys())) == "p": + p = out["p"] + # The pressure inlet [p_in = 0.1] and outlet [p_out = 0] + new_out["p"] = ( + (X_IN - x) * 0 + + (P_IN - P_OUT) * (X_OUT - x) / L + + 0 * y + + (X_IN - x) * (X_OUT - x) * p + ) + else: + raise NotImplementedError(f"{out.keys()} are outputs to be implemented") + + return new_out + + +shared_transform = Output_transform() +model_2.register_output_transform(shared_transform) +model_3.register_output_transform(shared_transform) +model_4.register_output_transform(shared_transform) +model = ppsci.arch.ModelList([model_2, model_3, model_4]) + + +equation = {"NavierStokes": NavierStokes(RHO, 2, False)} + +pde_constraint = ppsci.constraint.InteriorConstraint( + equation["NavierStokes"].equations, + {"continuity": 0, "momentum_x": 0, "momentum_y": 0}, + geom=interior_geom, + dataloader_cfg={ + "dataset": "NamedArrayDataset", + "num_workers": 1, + "batch_size": BATCH_SIZE, + "iters_per_epoch": int(x.shape[0] / BATCH_SIZE), + "sampler": { + "name": "BatchSampler", + "shuffle": False, + "drop_last": False, + }, + }, + loss=ppsci.loss.MSELoss("mean"), + evenly=True, + weight_dict={"u": 1, "v": 1, "p": 1}, + name="EQ", +) + +# initialize solver +solver = ppsci.solver.Solver( + model, + {pde_constraint.name: pde_constraint}, + output_dir, + optimizer2, + epochs=EPOCHS, + iters_per_epoch=int(x.shape[0] / BATCH_SIZE), + eval_during_train=False, + save_freq=10, + log_freq=1, + equation=equation, + # checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/pipe/output_pipe/checkpoints/epoch_3000", +) +solver.train() From 4b6c28553cf4869584279567de25924c8dd0a71b Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Thu, 4 May 2023 03:33:08 +0000 Subject: [PATCH 05/31] Aneurysm converged --- .../{main.py => aneurysm_flow_FCNN.py} | 14 +- ...cale0005to002_eval0to002mean001_3sigma.npz | Bin 0 -> 4244 bytes .../aneurysm/data/net2_params/bias_0_0.npz | Bin 0 -> 1218 bytes .../data/net2_params/bias_grad_0_0.npz | Bin 0 -> 1218 bytes .../data/net2_params/bias_grad_0_1.npz | Bin 0 -> 1218 bytes .../aneurysm/data/net2_params/weight_0_0.npz | Bin 0 -> 4494 bytes .../data/net2_params/weight_grad_0_0.npz | Bin 0 -> 4494 bytes .../data/net2_params/weight_grad_0_1.npz | Bin 0 -> 4494 bytes .../aneurysm/data/net3_params/bias_0_0.npz | Bin 0 -> 1218 bytes .../data/net3_params/bias_grad_0_0.npz | Bin 0 -> 1218 bytes .../data/net3_params/bias_grad_0_1.npz | Bin 0 -> 1218 bytes .../aneurysm/data/net3_params/weight_0_0.npz | Bin 0 -> 4494 bytes .../data/net3_params/weight_grad_0_0.npz | Bin 0 -> 4494 bytes .../data/net3_params/weight_grad_0_1.npz | Bin 0 -> 4494 bytes .../aneurysm/data/net4_params/bias_0_0.npz | Bin 0 -> 1218 bytes .../data/net4_params/bias_grad_0_0.npz | Bin 0 -> 1218 bytes .../data/net4_params/bias_grad_0_1.npz | Bin 0 -> 1218 bytes .../aneurysm/data/net4_params/weight_0_0.npz | Bin 0 -> 4494 bytes .../data/net4_params/weight_grad_0_0.npz | Bin 0 -> 4494 bytes .../data/net4_params/weight_grad_0_1.npz | Bin 0 -> 4494 bytes examples/aneurysm/plot_geoaneurysm.py | 141 ++++++++++++++++++ examples/aneurysm/single_test.py | 56 +++++++ examples/pipe/poiseuille_flow_FCNN.py | 6 +- ppsci/arch/activation.py | 15 +- ppsci/solver/train.py | 21 +-- 25 files changed, 225 insertions(+), 28 deletions(-) rename examples/aneurysm/{main.py => aneurysm_flow_FCNN.py} (96%) create mode 100644 examples/aneurysm/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz create mode 100644 examples/aneurysm/data/net2_params/bias_0_0.npz create mode 100644 examples/aneurysm/data/net2_params/bias_grad_0_0.npz create mode 100644 examples/aneurysm/data/net2_params/bias_grad_0_1.npz create mode 100644 examples/aneurysm/data/net2_params/weight_0_0.npz create mode 100644 examples/aneurysm/data/net2_params/weight_grad_0_0.npz create mode 100644 examples/aneurysm/data/net2_params/weight_grad_0_1.npz create mode 100644 examples/aneurysm/data/net3_params/bias_0_0.npz create mode 100644 examples/aneurysm/data/net3_params/bias_grad_0_0.npz create mode 100644 examples/aneurysm/data/net3_params/bias_grad_0_1.npz create mode 100644 examples/aneurysm/data/net3_params/weight_0_0.npz create mode 100644 examples/aneurysm/data/net3_params/weight_grad_0_0.npz create mode 100644 examples/aneurysm/data/net3_params/weight_grad_0_1.npz create mode 100644 examples/aneurysm/data/net4_params/bias_0_0.npz create mode 100644 examples/aneurysm/data/net4_params/bias_grad_0_0.npz create mode 100644 examples/aneurysm/data/net4_params/bias_grad_0_1.npz create mode 100644 examples/aneurysm/data/net4_params/weight_0_0.npz create mode 100644 examples/aneurysm/data/net4_params/weight_grad_0_0.npz create mode 100644 examples/aneurysm/data/net4_params/weight_grad_0_1.npz create mode 100644 examples/aneurysm/plot_geoaneurysm.py create mode 100644 examples/aneurysm/single_test.py diff --git a/examples/aneurysm/main.py b/examples/aneurysm/aneurysm_flow_FCNN.py similarity index 96% rename from examples/aneurysm/main.py rename to examples/aneurysm/aneurysm_flow_FCNN.py index d185bdde0..14b26e9b3 100644 --- a/examples/aneurysm/main.py +++ b/examples/aneurysm/aneurysm_flow_FCNN.py @@ -116,7 +116,7 @@ def momentum_z_compute_func(out): os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") -output_dir = "./output_0428" +output_dir = "./output_0504" ppsci.utils.misc.set_random_seed(42) # initialize logger @@ -244,15 +244,6 @@ def momentum_z_compute_func(out): np.load(f"data/net4_params/weight_epoch_0.npz"), np.load(f"data/net4_params/bias_epoch_0.npz"), ) -optimizer2 = ppsci.optimizer.Adam(LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=1e-15)( - [model_2] -) -optimizer3 = ppsci.optimizer.Adam(LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=1e-15)( - [model_3] -) -optimizer4 = ppsci.optimizer.Adam(LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=1e-15)( - [model_4] -) h = None @@ -301,6 +292,9 @@ def __call__(self, out, input): model_4.register_output_transform(shared_transform) model = ppsci.arch.ModelList([model_2, model_3, model_4]) +optimizer2 = ppsci.optimizer.Adam( + LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 +)([model]) equation = {"NavierStokes": NavierStokes(RHO, 2, False)} diff --git a/examples/aneurysm/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz b/examples/aneurysm/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz new file mode 100644 index 0000000000000000000000000000000000000000..f84b6c2acf463ac4f7fb12fb6283c808f633f990 GIT binary patch literal 4244 zcmbW*X*kv0y9aPeqB5j3sE`IKV-zBVOp)PF9!;c-JM+BR?0MeU#w3X%6%t9&@HG^n zl4NL7PfwCcB$5%P{j_2PE6pDVFc?7zoav5-{1E>(Fk zv45wuC>eR&JIGf%B#fBhxPPDX0dcVyu>^G=-^k+;>N`}`P5q42HC5I9LL;IgyhFS~ zBYb@S&0Bj1Mf!^JkpbRezM@!To35_rCQa2u)&KWc@Tz^q76;>#m>JA$ng1sf^;vSW zKYKEuz4G$YjNlB2F+GZ}D`h})lhZktLOR?|Y!}{|pAMJYu#!fxbW|z1)_C-#A+9T7 z;Cn+FQhMu0Brm6-zDxR(yH^@Q)E6(Tw@z0l@bGK(MhlUulIJx~ zpF4Eux&W)@lA_E-22d58#xDs_u0o#{%M+kBOFf1^8AJvV1{|05MgM z4~|3&z;d0_JoX;}65_0!HX94DdYK@lTU~(PmCbJJ*9kxfNFVw(#>Yn3Lg@L(2yg%#-|+JElA)S*K>OcMfj z6A$p<$o|otZ_k6cQvE(hLmsj+t$lP2co2|^ZMb?o+@^g>H1Z<-X2`^NY*(N*m6N?+LuypBdT*PCjYod zZHpg@23B17Fh@-`m~k<$aa{G7DHpRvM3p>aE+PiKh>vu+xLe22&fdsHtE<5V!5S_E z=1$h?%eh$b@r104A{W`UnsZmpa-dzjcwP1{4md`Ea_Qq7+!;_VKJtNs0BhgMO|Lod zl%TyVy~9Bc^BTS2CI=4XUO%eOaG)`9UrH&N13ANbf<2c5cEI5nB?bq<`^nO8<2aD) zEkBwZ%7MqkBLdTxgWU^HepzsggJW{%->Uw_0eOFYK&2}O<8xC_O`CA=hiq-RcpC>z z-*>oiwsLUV?$I6p4IGRrzIb|EUUWa#poRm|9NbME3n5EzK-ijNWID^n!0>vNb5m?6 zJA5>H^MVb-spRFKd)SCD(d86&u;IJ;%kuVzY;0(pAM&A%jkyg6I>lPp@LZ+zto#NW z>r5VZRbF9(da*7vCY24LuflhK0UO#M0t?4@Yy^{3Ta**oNV5!TC6L%i|F}IgESQZY zTV^|kg4h^|(k+}Jun|%|@y^SWjf%a}7mVH6c*XrtSLVou^KmClLy;Byx8Z5~*zo7c z$P_rRk@EXhRD>NHQ68(ZFYIRHx4D{+K#h%=@|m0k%52>KPH=g%lntL<5saU@gro8?9SeQDuBfiLug>n6g`2~(FcxAh;O|oYpf@))8tu0n(L8*5`UE_Kd&RC6%T~TG>_Du;F_9_-emsX_+ zC0LkIAsiT)VB!|t-Lrm(iSh$_W|X%~ggh>PI{cD}%3`RN^f9q|q}8jsgNYwZy0u3O z6Z1y9o#pQ_VJ&8` zmZ<3U*WF~m_@eN_>oNwee@)iuy~sdriM3{N0Ry+pJPV$kWkBBi*N}cT1H)F)L!2xI z?)bdRk`Q@yt;e#o3rhItken$1I`rjJk=8nj4o1XEec@Z>xaz-%RCtf zZg^>Y(}RI;hjx^Nxie5{w=(vvJp);+xqmkqGte11b8twF0p`a|huzmOaR2BngRLT| z%8v6|mx%7AHI<;en1L0VxqJsX21?gP5vM-V@!P%QqFXN=vEn8d_uZo7?Sr+~?L?jm z9huovO~>NXte2-Q(J|&gw5vZ)N0-m=J>=8zms3snmos!!c4eJa%%($cC?)C_FOdhSoh)hLVGM#t&sH)_~$;s_mbP z!ykXs@K0ByfAusCU&EAleVL$P^zRJ@9^*9p8XG0JjL~4Xvrgt}I}O2o=~8>zXm~cK zCEl}@2G7+|(QQpM81U|0k-bfWZH}JX+gcjDEM?AFi;Uq@4=yej)mgm6&#H`u@0K#Y zNvCM&FD&Wa%BSIVQL)Kz5DmzGOwif{_K|iDooBIC*2?uH`gz7~N^e zR-l2!u77z_hK8b|+&4Ti8jf1oa2kfGm^-pvQt=BF>`nqlQsg0~YRmJ_R5YG^)bMPO zikRf%nn|yyxV=T9X6OYK`A^HOBzmc+%5d*F{D2CNkDrD=H&P+kT5oeq>`NSnNDFQ+0?b6rVRAr;qbUCef!qT-{Eaa(&f70WeD)@h_sp(sB8{Fsmm zM_mm`KQ;W=~NkwV9Mu{Pbitx+342_6X9KC$qVSOYO$28^@PI*&N@=E_fi^y4a z5%I-gDjKp*N1ySa!p`pCoiJM}rcK0Zr!1)W{4IZ}aJ%TdU&e;BnpEg0WRL@tsMyul zcVYiZQT=avYRg3CD!*NDZW$FdOV-TB&!OT*rF@s$5Czp|dj?VlDUcK{T4{Ta0`D&I zVQM1#DOoUKCW#GehtD@MKE23P4EvjmW%3!34mZeXGmf9B$|pnW0{Y@vWIP!#x0hy+A;CL6 zzV|R0=_X6Mx}3<^y!&;4mjxL)h1Dkm&B3lgQ$7bB-D}g+|rLE;d$J) z`semZSa4%t&$L|$OAkwgS;>dM^S?-lXuKv%Xe8m(6^ZRlWh6L0tSCENM1qCY zB{TOt5)%Kazx*bf1kzKrf&FX}T=ssq+kKRT=-$pt%iKv&`qs1DPKN~ZX9ceZv`APc z#P8k9N$3h1rO)Y0z`4o#yufP-_)%lq=9ZFxx(A;9ua73+g=@mvM6U!GIVs*ZbxFXh zgxzhfnh9_j*=QT`DIPNe%MuLR;*s~>e`!coJd$SgN0U?H0o~i`gVcCv43?x{3>B>l zC0fMGiD20YUcA3ZM2?y9(9Tmt%+7CDRwfc*{IF->O8^n+KN9t(y@}`>-b1UkAi~0E zwvf1mh`Svtn=4il5qo6P<DsG0D~v;z%ORsidK_+j z_cFS8EDr7FMTQo=u_)VXwTON!7H?Y9zL#6XqSfX+@3?*})cv*I*UyPX&hzbN+{ZBp zcI@6|-W-F+WwN%)1u^)hvxTfhiov9`%EbDR81&1k>gU_Xpin8izfv;>ODIaWB1JY= zsHfL$h(WB(*2vq7V!)G3UPu2F4XHV6$Q3Qom@Es-n0F=`m1>DI?P<~QI~fH9NW^uu|o2gk)I+ zyq+;q_a2VG=B>Yc@ fL5w2)@8AEn6`bwoN&cG<7k!2zZA5(sF|q#wIm>!A literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net2_params/bias_0_0.npz b/examples/aneurysm/data/net2_params/bias_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..795af420c7965d6b32b3b2457bdc4b807f349e2f GIT binary patch literal 1218 zcmWIWW@Zs#fB;2?K)<}(7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0YukywxlfF`*Pv5?awLp``8z{+i|L2*!%u2vz?;(<-I{&40id; z1os#^*xE(^3W5V5zv)xa)b50jn3+wXg)Iw|jCOlr5y{1|HMbA76H z%H)`R@)Gv@@-&{GL~Dsig(OPTxQOs@zbKw;_!AZ({c-o)6P5OP8M6- z4e+pBx!S{$f$PAI16yb8m^CrmB4akku39^eZ3)kucDnU7?g&5$h))?B^{4@1I9LP1 zeoyO;KUPxaKUY1r&`#qt6MNlgDRh)&r}Z8$&F_8*+Zpw%cc=avt)1W2 zR_(00w|Bc*JLk?Vl2(>%A3ZJdjCPm@IWbzWoA0(n4T$F_qry-F!f3Dtgx0*dJKKtn zY+KX9v$Nw-yXEIMoMw{`D_aKYiJJ+Vv+W2H`o7IpZ=*%pl1R&>o)bHgey-ZKFG0p4 zSaag$f7@7hnTcClei2-3cK?W$#e~T}(NcsV-?i}<7Hjoqx5MBY&H-J(M3;@Vk9`XPH literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net2_params/bias_grad_0_1.npz b/examples/aneurysm/data/net2_params/bias_grad_0_1.npz new file mode 100644 index 0000000000000000000000000000000000000000..303dfc2c3cae9c6e25c1bfa75fd937f97bb57d51 GIT binary patch literal 1218 zcmWIWW@Zs#fB;2?>YN6v3qTGCvonY=B*h!(VMbToAo zY8A)_Tyja*cLp!A+kQty(o*v1e~U65+Z|l|OU)U0A6YOgV%)AjkHg}utnZGh7jMk3 z?6|~x?Xqhyl(bP$3yM@H5EVGQ#3EMyWC~U6^nP~Cln7ieY4_kIz;5@NSJo3M} z-#6|pKm0%Ml)0{C>6*Y`zM+oOf@l9tv=nh@qx$p~V7dokNY*fh1q4V41Yk5pS;LUh zoT0$=Yu?YD0p5&EBFwmQHpIOkvVjpqLi0JgCe&O2QV0PJjGRDiN%7!3fvyQP#lWyhS8Kemu)&btEY#=EXAiM&kZvdqj7yz@y9C!c# literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net2_params/weight_0_0.npz b/examples/aneurysm/data/net2_params/weight_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..70864ce92ab56e312b49057458c47948f5e5611e GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net2_params/weight_grad_0_0.npz b/examples/aneurysm/data/net2_params/weight_grad_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..791cf4c81490b39b9fd4ebde7aa2956bc6ff6d36 GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net2_params/weight_grad_0_1.npz b/examples/aneurysm/data/net2_params/weight_grad_0_1.npz new file mode 100644 index 0000000000000000000000000000000000000000..4030a2f89258ca8279cea7a5d2292d288475033c GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net3_params/bias_0_0.npz b/examples/aneurysm/data/net3_params/bias_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..f6d213126b5507df53a12cdcc3eeb9670a9dae2c GIT binary patch literal 1218 zcmWIWW@Zs#fB;2?#gawF7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl5YBwcFf6ry>D{yF_UpYI zoIN&E0`vDgI>BYVX!}wdzr@?Nd<%Z;2~LjPJ3CTyA8J5sdo%w5YCsqb)_@3Iu4Q*) znUURu`9^zZub;E`@fBseMSmIX0{*+~J88+jFZGJWKBjFPcKZGjb|SYG_i-!=w{3U! z-M6GZVDGns^0rH!1lUbc*RU13V7V`v@4#NvfN0a=RcHaGdk}_X4P#h9fP_E*MpKkE z3@ObS3S1^7A;4Hj!}AbkTU#lQdng-Id$ literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net3_params/bias_grad_0_0.npz b/examples/aneurysm/data/net3_params/bias_grad_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..6b4f778743f17ecef2fd6bd0ff2ae662490131b2 GIT binary patch literal 1218 zcmWIWW@Zs#fB;2?5P{yi7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl+(OHyX_-5(-&?z5?h)6WGp=dx%$TQS zKA}LsvSDxe&N&am%r&dN@8}9P+-ZJ&*G~620y|bF@86NWNqc7iN5Qc*_ zATG@>+ZiOrWfhmXbi4BIB|BDJony&5`O3~Cww#umTI4OS&NtZ^;_+sO%lYh`Y`YHb zSZwIJi+RaLOO2*gJJYqyEay}nviPe1awkvlot@L3Ua>?Ch{qP~YfuBiXs`yvC;L{* zGwTmn>Ik!1MX9*&IA0RB>)s~0oo6##ELYx@-6h7uZ^h())>2PI#WJq$jHQK9<<7^P z>n&Ftd%x36gJD(}7vW77%AV5MO0HZ0& z8ithS3@eQOZnZXj^Y(Zp35(kmb(R-B+AM`kop$=J>f5o;Nn@w>daj-SdY#OR zw!F63)$X^meL<7?^u%2|D%!bs&i0+Rv-Rx7?bD}D+94J$y)ytMASN4K=Rpk!!@(L5 zAELc>P7AqjX&+Fqec$JX9f`kcEZ?o)uruH8j)ln~2FsX-!aD;`AKCG%%5kUju zFr+kRC~z?ddF>AHW@Hj!#+9=n?gfzzj35%4&(SrZ<^qsH2xwsB1Zqo)2j>ZNO{ggb srUhh^5EDofIQ^h&LJeJHP14LDP2jK&@MdKLNwEOo6(D^BD8;}40G(ze?*IS* literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net3_params/weight_0_0.npz b/examples/aneurysm/data/net3_params/weight_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..90106819f3ac1c9036f2e28cf7f496c930070e21 GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net3_params/weight_grad_0_0.npz b/examples/aneurysm/data/net3_params/weight_grad_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..27b272c63f44fc75a809fb9112fe0a38cbe88ab6 GIT binary patch literal 4494 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 G(fD6A?q3W5 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net3_params/weight_grad_0_1.npz b/examples/aneurysm/data/net3_params/weight_grad_0_1.npz new file mode 100644 index 0000000000000000000000000000000000000000..721ec61720a4a4c36c887b62f5bd5987f217b4d3 GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net4_params/bias_0_0.npz b/examples/aneurysm/data/net4_params/bias_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..9ab6f005808ba1ab742d685945a8752855a5a591 GIT binary patch literal 1218 zcmWIWW@Zs#fB;2?Sz7v`7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl^|lG+NZVPqHVU0?mo8%;dY!%B6hK%Q}?}GEwk@6-)lRm{MU9Gp1S+4 zKH}c5ux*i@$GtOq^WU)A-;!srKU;r#pM~CveVp$Z_baF{><>T*h@AA~FQ@@wI9LP1 zY8&6av&Y%(I2ph0ez8c`wofW}-~0*Xw$@8KZDrIx?~UBN(DtY`!(OGW3bsdfIoW+n z3g0*9Zlc|pHuZg(UsvvN-oOYH1+r~xtQ_=IPu0bw*)1LD91yM4bq z-`QT(nXq>=6W_jPl45oX_UqUM^Tyh}T5GwlWJ`qYnlsP$_U&`GJJ}><=Qwlb-ucs( z?D_cm=brY3<~EW$CH93a3*Yy;VeQ`8f+>4Z10wsA5NiuC-GeYBYZ$`<0we?iFq)#Q zVMuAtP~fsSaAJ3WHzSh>Gp?KsaW9B$U<8rSe2%UOH5Y&sLO=r}Cs12bJUCCFYeG#i sFfAaPgqT2@!088F6Kd!pYm#OLX#$6JfHx}}NQwmruK?*AKq&?W0EogRB>(^b literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net4_params/bias_grad_0_0.npz b/examples/aneurysm/data/net4_params/bias_grad_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..bb703f07480a7e5dd073c6b0c6ada77fa05db9a2 GIT binary patch literal 1218 zcmWIWW@Zs#fB;1Xt{mml7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxlgu&n?G zi>*|L{2mUsC$^R8*Z0`GZnk;QR=r23_ud{M*{OR`1LAbW$u87@FdD1@!F6@xZU@QM zy$XLGTdz_q+H-H|ls&>17;SW{+HGa?@7TPZbJXTgn7>tCnv~7F+DSI96>@v^T0ZVs za=zWh>KcRHve!(zcdXpCN5NFZE^2eZF4Taq-B$Uv1(@zZ7?L%NVF3XW0s$CJQPwb| zG-oJqiS0YKFTk6TNrV|!&W5-bL^d#jNN7Gs*Myo2KnfwCfsqraEh!$HC(t#arWlwO qkWE5NAWh)(gRTiRbdfblGlMjN!#cp5l?^1t0)$t9^bMdC0|NkY!XeH8 literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net4_params/bias_grad_0_1.npz b/examples/aneurysm/data/net4_params/bias_grad_0_1.npz new file mode 100644 index 0000000000000000000000000000000000000000..78100834d1207c8ffe9460e5fcf0831638b5abb9 GIT binary patch literal 1218 zcmWIWW@Zs#fB;1X8-`V}7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0YukywxlvqR{ zE8e>+=YjR5;^aMl?#irRR8#k6Jn>P!&_6m95 z-_yZVU?V2~!dBz;-(6Nq_wC_P5Vm{pu6h@0K(rr~kZ1v>dk}_X4P#h9fP_E*MpKkE z3@ObS3S15Ux9$t@W@Hj!#+9=n?gfzzj35%4&(SrZ<^qsH2xwsB1Zqo)2j>ZNO{ggb srUhh^5EDofIQ^h&LJeJHP14LDP2jK&@MdKLNwEOo6(D^BD8;}408R literal 0 HcmV?d00001 diff --git a/examples/aneurysm/data/net4_params/weight_0_0.npz b/examples/aneurysm/data/net4_params/weight_0_0.npz new file mode 100644 index 0000000000000000000000000000000000000000..c0c66eb626c8a361ffbfac13b14edcf1eb539613 GIT binary patch literal 4494 zcmd5=dsL3;*M2*wbTCnp6cwH5q>$>p_ft|*I*b$)q|8gCo_G#-cSo$VZ51vpzdQ5u`PLN|tJ zm?&#-y%%U`D{FWMg@lE81iA->Z1NhfuL=qG`dSY4^$7O*`l@NDt!$vLrL7#J{C^Jd zu8cHB;<+KSb7eEBJaUCB(b>)LTt}D+#i#h=jSZEfvEgh@OAs5QG>=&nkjNY@E5(yJ zAF-rP8Ac8)2d|!atiK|U;mlfs?IQi)7Td$vBt2u+7G|;O&#p63#1?RlA|iZOxS2CJ!{kh%j+kT>n2Na z_09}xw|o=U9EpO4&{@n(g<-NiM+vzjnpil;6`zJ0v1v;i>3~2t|5BkV9h=xrvn6&= z+3GeL{VE7@wY+dbHKh?Js$u1WOcZFIz$#{&!NSdIv~lTDK1-@W7F@T8d`v{Ak&1H<;E`VZ^Gwc&$&_3otp;+B39(`ep?tQo5-#fy>7ZzONdbuJc;aVCoI*R z1%VcVj8F4BSP^1~z0X6SA-xXfNokVW0ShdQ%m=fC1o&|3CRE+IL)8}+!~Wm~u8gTC z8EFt>E<1=ZGuE#G?UOF(;X9iZQM?MDE+2ue=Z-W>_jZ*HFItmN#T=j}#ln%b-Q;mIJ#iAJb-b(lx3I7{E6N zA)`FfxXhG>M{dPkjY>?osy52{hhRkWH0Joh3wYG;QAMwd6mw+iAGE7v7PBe+2@FLX zqnh3m;F;wzFb`q*l{OdYwV)WB=2Jpij*Bw4LKC@}n>P{y#c7gEX`RGif znU-rV^nN0j9sAXTauc;tf97JkexW$-0R;?nJc>qcnbc>2A{%zxl6tt7BCk3by=|qa zOAsHtpGncIZO#~{;sF|`j-gJl4CC2#5?{|+jITS(@z97FoSWtjef65G+dT)m{Yw;? zB0tFed7mBh=jPEGrD)9RFT=-IR8hrTjSZVrO6(Wh#}=0)cu{FKyogR8YlWhcE|}W;l$`Q@P2?hC z!AJ8pJnOnufob!B7ygVE2JA$`Phr&8G@oiDtAkHpUG`{iKy1B3o8`ln1N?0SXk3a?h!+DSP_LEa~tvU!~(GISqjI~E>aVNc$Vmk zvro=SV1(hWuRjVF+9HEc*Hf0t?3~6f%4_GwDY%irkFH?nGy$IX@bUIGLvB@62jPBP z!3ICoV3OzNLuU2?+VyJ+D8-G^)t14yz#2`@en zfFF5W#`~;0`mK787VCZjn-4ZjTJ03p*67vXQ^eZ=W{11yhT?Cr8*+852iGY$^4W`Z`%@K=OhHxBf*8sqRU z*6gRaHmKgvi?7yEGS5vF-fI@ZlqaY7`5U~zVAfS?ax??;_s5{F{}A+a&Sl1W?C|Xi zaV$0W#Zl>0S}d7BCZAnI6)SSMEw(?iiOMceZS;aFPLyXj3bFWh_Am7A;vzT|ZwYSM z8!8RDib>J%6|DKZ8kv$ryfg8$=}kE$Hn*CC7eNpQtv}%S!qAs)G_fG0h+wf)C z6!u|&2y0|oi++DdW6SvkZ0&G9T>2pxq8>(~Y<&n>;eQ>=Tg*`=w+Pi=av|unJ#3c$ ziLp3wog^d-fui*swjFc0;q~fhJ64C~8oN>Zu^;M$KO(0c^GSL19UN}GN!g)Tj2TX+ z{mC5mM45->mu&b43Qr9Fw zubw=5$y#zhq{*_4v)|K_Hfc6SPJ*#_Sp+O;qeeH+;*YgIz~Br?SavIyaO8cU%f6C+ z_;dhn?Ayuo{_F&;lUH(MZW*%&q*^hB$iSsF5=^J55}U!CCn+HlNJMQm_8h99i}ds` zp4_6dRVFZ+U9-tXK>=_q9fOzp?{KuKo8${8!J=AAGTBK2Um1!r?!&QUnSU$R427ce zj!STN^b*Z>{Q-J+O@hXdOzhNg$2F^_vV)?g^w7^0+zZ>pAoOZHS$w$LB>cBx`04i{ zyrPv0i{I^sTILgEnP!8r&TeoF6z0ZO&L^p^^#{)@NFy z?w(-$E^-LpT0%84qVkGWzENz{xEF z+_lw^e{?7871F|sNry0fhY<**_R(_FXgC};3e11hnAeNBT>p=H%>1R!xbAKO82KgR zCSD!%b80IC7jjvjCC2bUPXb3;RbYp-3=<%v4Np36K%oU6=8A8|vh_Kn-EJ!GDUO4H zi<%gyX9TfTN1(xE9)y-RWB;~X9Q)LPkBsL+!@f1l`k^H1?qSS#(c6S^KFdJs&`+>` z4i8keF2oJq7s!f&b^Ib#ciLi@2+60@LC)6*b*1ls$F@#WI$xJvbL1YG>n+BxFE4?O z-8p{#tphNxFpEaI%i;BNt07Tg5YGK{mwU^r7<+V+z?W4*)l=8t5>Eyi<0nCp9G{LH znE_{}4A24YWjHGz1$=!Cw%9HO9>%nTijbf1dtWy z@!|8sAaO#KTyIffWLCAC_Wst3#m^t&+8H~repMyev1Sk01lOa<;0aKCT?wysvM|cm z6kauX;2mXk@F`tRT7KILN)0z*+i?jfOdG`d1Bdw2W%uImk+uBMq2rjHodGDf2h@Ij zj9XW312ct0aJ?_ejK!EkS8*Tl&B#VkWpn7?dIQHK1zDjdt=Qq%MKWAH`F7U|se|}1 z%~Y3x(;cF$#1<{?x#_-dX$;^u1&LJLvRR zScLmG|NKwT_tVDTLAhe%pl`FsKSAF!^>kQNpeY|T+?1_ z&c#L-iRh}6qv#$fy1I1vQr{WlbjJAp_1rs&amY zF30QsuB5FaIGo{>=BRQ)HkeNL-x@lCqx7RR+&26)94WT;%k3OSaDq8uhVCALZUKg* zjv@3kH#F8U^xP7#J;23(!9r~X*A^BZ=m9+;p%C&J#vm24*y#*?_{|si zY1ekrdm~G0%vZqU-7D#(na_F3(Ss!L@a?HEo~~mKXfLhjnY4$96e1tOvB5l&%sN3^%g?~EIZ3olMISF~g(fJ; zOroEJ%{ZS;?I!C>XAz^f-nwA-3sHA$4F<$g9L{k5Bx>egL=BgQD@=N5y41VQ4hyjr!ucfuK;u7PIPsqBITT}L!}o+P)o&JoUo*WzP5M-+U{Ne z2fc%!`TGk{zwj~hI-(rate%BEqi5mhc4cJoe2BR6AcpAE=aHdjGkCeC?ey<;9I{tD z0igzS)OI%!eZ8VamZw&5I* z8Tl%E&15+K(<0Jea1gY4kgTukNY;l~!v3kf4aB$2haJ=F;ELcnC^`Qb&a@JPm9y7@ zfK7_ZV95?zAmTbDt(-d8NtQeaQ6ab?lnF7SM88F9PtB`I2(icK8WV*B!Je5BzL z>8P0r^sOht?4XHoTH92>2sT|t zwrBhE{2%nu8pX3uw}i#5DZSi`8gjoeFq{+ZbamXh(A7pn|;(Iqc@vV3>_NPs5BF3=$#p*;{CTH^eNp@q_2xrod%4BA}948nbjm2x4A;LIx}P(Vkan zl(SnTzPDTnM;BFN7bz2DTHpgq;2sPt^Ql}-mMYt!#{Y0V1NRPPG3nC}p;Z&CD9=;M zRAb&+>WOPSYM*b97Y*LV9^bS7+clUJeGYXz;G-f>4$duK&-ks$0DjWtsB3;Zv_AbA zzVEW8mW;WHb`EkGhj5mWoD~I^7c7J)ij$z#xEe-neiD*7t%&1e6|uvm_Xs)PB>9f+ zqHghE1md^Sb(xO#Y3an8Mtf5W$MeF2NXAWCVy3o z2!Fhl%A9^)iLQV4p)%yBQogzol#^`+YKizAI}rm|({2E-D?W>hFC73W^9(`EpLapO z;c7A=bq_N4J_NK!)#Atxcd%O2RCbh130P{QLhS3INgovtZ0x9mCyWWggBA&-cC|Oi zd)@_d!n=Ws>0-DwY&uGrC}Ns~yO8isJ$+byJP2-{iR8};AayhZR;65o^TJl3lznA% z|AeWGB-~;7aT_`HZh7Q^}@K@n0 zTp->ztZc*iQ~1pOTZQka?HeLUA&$&UxNOn9QHgJe)&5F08N3T^#Q;jqwqU zrT29&0^FNBnb^1XU`PPrrgs9mlxGN3&P9WEK?SpWAc6E;e2R1pvH&U)Nj#4zA+9w} zAfEfI!m(280cYVplz;vhQeWf&jxW$6Cg-#0x6m=bRyc^Q<$*Ni@&(8Q$* zbAh$F4LY6vg7h}B1{GzWc)NV#aB9zG!u6IdE;b7XWnwQh<6H&$v``2HX+wlUqcrY( zI01y6lEfR=c6=WaRLRz_mr!4}9=>b18FXDAgX+_!F_*#`7*X;lQFw*|^c$f-|Ec!| z^qhFh*k$t>%j~X3hsja=DCETmpz)9|b-2C|c6q7wC1J194KOszGJQx!W=fhwM+wq$e4OEjv{;=q8I5pd5lG2-;y74-;|VQU7;!L3g3gk9KpbLQ$i!1eE__6YD4H%uN@N(&dD|?Bx+As>qxOb* zvUZB-?R!I5|85$s{8|ngq$r|s#S~b3%^Ku1tD+3`1ktk9K48J*8pc5_7r2Vk;eu-( zw9qUboX%M{jPGr6^I!%XAd+^`G{y-;YoNS?*tt=BNlGejYD=02*kQn11|pn z@|P8hv;}{Ftse>W(t9F25jvKdAAOU~-YErp60D$-yB8|tCICrIYv8@<8<5UZARHsi zS@DF)Bng7fV>ym^yW~pDdTPO}PF0@1_ePvy+5)cqUW%8=o?&;){EZCoO2_e% z4{_SLAyDRRfDM|p!9W-W5z-tYCyC3Ne&UitIuCGRaVO}ys*c}gY2liwT_6RS6TVN) zv1>va5En+`#d_P>{6A)pXO6DJ!lT(ZRa_0M1RY2!uZ*e66QJ#5_KAdrhvC<|hv<~% zF!=MxF5t;SwOwWHAu}w z2zF>q!<&NZvGIpdOi8aiU;D5Es=d=qO_;=^AM zb+scHWq|?XWc-?tlvm-|lTOV3%)`X`=x`==tQ!i*@Z{a_UdpVzcATl-)l4klR?y`i zrGZgc3*|bsQ$FK)A|A79)lB}}7#=FJ9K(kr$FUc7SW$~> z1=Ld~E!JvvK4TCUM(JFj>@JbQ~aiTlyIp8n>J6GQqR4`b9p3B zD1>n>*4&{O@6>XOmhgT$dM`zsd{Ha%Es3Kyo&5x(P;M867Or!TGF^4-=A=TG6A^_TDsmxkl7`~TzktXzBpfAQwS zmT%_2^5(Jw-I7%q6}eR<8%wG4JC9&lsdLm74F`6o%&w}s0)r~I>L+ZlPAAl|GN^7F zeT-f0po-3Is!`AP@<*dYhW8->_XMQ2SaMY8(1A6bGE#9G#a71)+j4LqGpb zKZO`FdWJB-!q8aHFd#T&bBOPH@8A$W|Dn2T$QJ)EfonmgRCpMjGthZC| z{~U@r>y6k-aRr0c8KJ|1;rxvehY?#ioRObC63!`*&^BQr&htqRHaCCE`If$=`u%cA z^)CS3RnMhuO{Njm6^&ff>}j;q$N^mLbcE|K=%=~{&XJH9o?~rFXp2o3;XbI(SQK64 zG`b(a)UKV(hN2cuXeCcPeWcu79eLWoM1mDVk4ZcBag@I7NqAuKVkRQwB)7abfXUcb zO%0D;C@Hnz@e|eEluk+ob-UCHxIeu|Md!LpD@R^|Q>^Wo$CoR)lVzjGRT}Q2e$28=}Of z|C%YqQ{sp4pnN6vPG5p6Tr^1V^Z*nfUjX{`s`28gm(U+3MguPKb)EeDd= zsZSEU0?D=K`OHGuATV{}Yf!bT8_Zj_op(bXaMGP_pdg2SD~1t<5?HBF28~>+$x`F< zKvQ)#h>MVe-Pad0if=OU)qzsr`MQyez4DR7t)g^^Uiqzw%9Q*NfA8SZU&I<9H+E;Xq{zlqi zwh7~<9YTrotGKGB*R<+HIXugH0{*El3O`IxV%D`5Q5vCjR8+!oWKa`}X01kO>%uYg zpxYJNZJHhPQE47y7I*>7jw?iCP0bKxEX4V(#@v{dsfzbMDfE+^e+JAcNQgR(B7`eA>y$Hl(7JtO)BL(!laRXTpqgd$0v1!grEt@c!3& zXv(CG;Bs0b&hg2G*;$vM??i3(a8M4;5&VGWDkh_yYV+WaIoj~-HXo=Qb{x%}?2Q$F z>cB03w&Uw1#iYP52Q2QL42nm*1&Y0s7~P6J__co?&lJ4Cz0!#Lfoab2}i|G zWp!)i+0bD&EVV5W`?cB-voTjm1*#<5OpD?Bky-dn*;IVVzZ*A&Tc9^V2|!PD3MXk0 zxHS3^RC!>=#vUlgs0VP$BCYgr``ay0^eLGXpwnz7sbt&T z$5}rE`DEq6F}Nl;39k{_vwPZg*+w;gHcd7U2b}XK=To}KOqmyi4M`z>W1_%bCna$I zOgRX6r^VEF`QnS8cY)h?Gl{_ur9|FHjeqBn0czWy(VgS=FppzsGH_6p_-nWjFXR2p zjV32xqTT?UyKjT&1Y_7K8H-~=PNL^m1Mo1C#g%#w14WN@@qn`!4qjabQTSO{^CyL~ z-0pEVdsI-gOCzYCUj!2D`+=9jJmhy@fa{uf;j0DF*uBD(w5sWVs?uMX1v6HId5%2& zVaX3zSg8xPjk6|B4_A^{gF;d>NP}08cG2j;6ee*-J8nAt8@9I^#KZNC8R^r028g48 zjbS9nUY$W4Jz{}4cqB+(e+|^>OlF$Lt;Y>V_JCK)xkPZSoJ<)Q&7W~S2?llB=nM4+ zm`N+=lGH<*B+bH;Y;I0tmQ=cfysZzxDeqQ5D=gy86)a)<&MNRUIS$%IKVTFp^~ime zft?e*_~M&Uy!`Z9-hA8&sMT?T>Ghop;>B{j|KJTWdFv?t8FB!@k2JoVzeDg*%R%_P z@FgUuI1VY>P<|6W@&8xhlO7c^o^S}I&&DdLA zBLyeM^1f!X;HobhB`k0TqSj@h{gG=VUaQ-{1%o!}g2>ZgGq{FqTdyz&)Rn=Ni?@*O z^9fv#>ny)AA1K8mRw#nwE1u#i9g4Ti=f2=@$*Q0?T-uCC~O}{w0}#- z9~edw8%;q%hZ+fyA0Q&tS9Hq8hj@=p%$83`b(8r~_D-=qh!}uZKpT3%J>DvteO% zDIWXi7PwZ~4?InHOo^(v{Z_j0X5MBj@8JOJ%V3kb@C!>-KPqZAvsx?wDe%d|IwK4}ENjt{5O;LbNJKV74Wi$Aw zSdU%w{0XPj)#^Rv2aUk$&o-}H}kb8gSbt(LPJ%gI(O0sU#jJVv1%RK!v zoi?zKE`-ZC*ESDHy-hJ)?5M^WXgfk~SOz zHP*p+wQ?Y58c+$etaWhVOd*s6yny|^xm=*pO%OXwADY$7!7{4zzyeKsa9;g3$QqwU zsZ*N#nkSFx(EPRkv>5Ja0&G%eXUM>dFLo*W2Ggr(@rMMGKIi@umF4U=a9(39Lpa2B*|Bgg!?<4 zxChhiVDAPGoTDEF!c7hXnf?BF!Rl39dI=ADTSa)p>E#;2Pe^VE{yF@qwg;Pqs zyKd8W-h9aNnf)touJ}+vP#*SvU-|X0EOyk)qvVy&QT9`#4!_;ZrF=?@dU;RXX}&JC z4Z0*MUl2nlzP6-^pBqSq4Ny5#QVTatLz*+D2HlKr2i6yN@R z=o$5OH1Xdvi+_T?cg%kW{rUyA)%&Y|{wL`B+s5BP*~5oGU+*6O1bxrc-$9wGL!hs` WIXevd>eJ-}a)O30JvnMajsF2&lVh;} literal 0 HcmV?d00001 diff --git a/examples/aneurysm/plot_geoaneurysm.py b/examples/aneurysm/plot_geoaneurysm.py new file mode 100644 index 000000000..c564f73c7 --- /dev/null +++ b/examples/aneurysm/plot_geoaneurysm.py @@ -0,0 +1,141 @@ +import os + +import matplotlib.pyplot as plt +import numpy as np +import single_test + +scale_test = np.load("aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")["scale"] +os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") +caseCount = [1.0, 151.0, 486.0] + +W_ctl = np.zeros([len(scale_test), 1]) +W_ctl_Ml = np.zeros([len(scale_test), 1]) + +# aneurysm +plot_x = 0.8 +plot_y = 0.06 +fontsize = 14 +axis_limit = [0, 1, -0.15, 0.15] +path = "Cases/" +for caseIdx in caseCount: + ## geo_case + scale = scale_test[int(caseIdx - 1)] + + nu = 1e-3 + + dP = 0.1 + mu = 0.5 + sigma = 0.1 + epochs = 500 + ## Aneurysm + ## + token = "aneurysm0005to002" + token1 = "aneurysm0to002" + + ###################################################################### + # BELOW SHOULD REAMIN UNCHANGED!!!! + ###################################################################### + + print("path is", path + str(caseIdx)) + + Data_CFD = np.load(path + str(caseIdx) + "CFD_contour.npz") + Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") + x = Data_CFD["x"] + y = Data_CFD["y"] + U_CFD = Data_CFD["U"] + U = Data_NN["U"] + + device = "cpu" + u, v, p = single_test.det_test( + x, y, nu, dP, mu, sigma, scale, epochs, path, device, caseIdx + ) + print("shape of u", u.shape) + print("shape of v", v.shape) + print("shape of p", p.shape) + w = np.zeros_like(u) + U = np.concatenate([u, v, w], axis=1) + + # Contour Comparison + + plt.figure() + plt.subplot(212) + plt.scatter(x, y, c=U[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.colorbar() + plt.subplot(211) + plt.scatter(x, y, c=U_CFD[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.colorbar() + plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.savefig( + "plot/" + str(int(caseIdx)) + "scale" + str(scale) + "uContour_test.png", + bbox_inches="tight", + ) + + print( + "path is", + "plot/" + str(int(caseIdx)) + "scale" + str(scale) + "uContour_test.png", + ) + + plt.figure() + plt.subplot(212) + plt.scatter(x, y, c=U[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.colorbar() + plt.subplot(211) + plt.scatter(x, y, c=U_CFD[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.colorbar() + plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.savefig( + "plot/" + str(int(caseIdx)) + "scale" + str(scale) + "vContour_test.png", + bbox_inches="tight", + ) + + plt.close("all") + # plt.show() + + Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") + unique_x = Data_CFD_wss["x"] + wall_shear_mag_up = Data_CFD_wss["wss"] + Data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") + NNwall_shear_mag_up = Data_NN_wss["wss"] + # show plot + + plt.figure() + + plt.plot( + unique_x, + wall_shear_mag_up, + label="CFD", + color="darkblue", + linestyle="-", + lw=3.0, + alpha=1.0, + ) + plt.plot( + unique_x, + NNwall_shear_mag_up, + label="DNN", + color="red", + linestyle="--", + dashes=(5, 5), + lw=2.0, + alpha=1.0, + ) + plt.xlabel(r"x", fontsize=16) + plt.ylabel(r"$\tau_{c}$", fontsize=16) + plt.legend(prop={"size": 16}) + plt.savefig( + "plot/" + str(int(caseIdx)) + "nu" + str(nu) + "wallShear_test.png", + bbox_inches="tight", + ) + plt.close("all") + + ## show center wall shear + # CFD + W_ctl[int(caseIdx - 1)] = wall_shear_mag_up[int(len(wall_shear_mag_up) / 2)] + # NN + W_ctl_Ml[int(caseIdx - 1)] = NNwall_shear_mag_up[int(len(NNwall_shear_mag_up) / 2)] diff --git a/examples/aneurysm/single_test.py b/examples/aneurysm/single_test.py new file mode 100644 index 000000000..dbf9d393a --- /dev/null +++ b/examples/aneurysm/single_test.py @@ -0,0 +1,56 @@ +from math import pi +from math import sqrt + +import numpy as np +import torch + + +def det_test(x, y, nu, dP, mu, sigma, scale, epochs, path1, device, caseIdx): + + R = ( + scale + * 1 + / sqrt(2 * np.pi * sigma**2) + * np.exp(-((x - mu) ** 2) / (2 * sigma**2)) + ) + rInlet = 0.05 + yUp = rInlet - R + xt = torch.FloatTensor(x).to(device) + yt = torch.FloatTensor(y).to(device) + xt = xt.view(len(xt), -1) + yt = yt.view(len(yt), -1) + scalet = scale * torch.ones_like(xt) + Rt = torch.FloatTensor(yUp).to(device) + Rt = Rt.view(len(Rt), -1) + xt.requires_grad = True + yt.requires_grad = True + scalet.requires_grad = True + net_in = torch.cat((xt, yt, scalet), 1) + u_t = net2(net_in) + v_t = net3(net_in) + P_t = net4(net_in) + u_hard = u_t * (Rt**2 - yt**2) + v_hard = (Rt**2 - yt**2) * v_t + L = 1 + xStart = 0 + xEnd = L + P_hard = ( + (xStart - xt) * 0 + + dP * (xEnd - xt) / L + + 0 * yt + + (xStart - xt) * (xEnd - xt) * P_t + ) + u_hard = u_hard.cpu().data.numpy() + v_hard = v_hard.cpu().data.numpy() + P_hard = P_hard.cpu().data.numpy() + + np.savez( + path1 + str(int(caseIdx)) + "ML_WallStress_uvp", + x_center=x, + y_center=y, + u_center=u_hard, + v_center=v_hard, + p_center=P_hard, + ) + + return u_hard, v_hard, P_hard diff --git a/examples/pipe/poiseuille_flow_FCNN.py b/examples/pipe/poiseuille_flow_FCNN.py index 66e6e0395..5de6ce9b6 100644 --- a/examples/pipe/poiseuille_flow_FCNN.py +++ b/examples/pipe/poiseuille_flow_FCNN.py @@ -207,7 +207,7 @@ def momentum_z_compute_func(out): ["u"], LAYER_NUMBER, HIDDEN_SIZE, - "swish", + "swish_beta", False, False, initial_weight_u, @@ -219,7 +219,7 @@ def momentum_z_compute_func(out): ["v"], LAYER_NUMBER, HIDDEN_SIZE, - "swish", + "swish_beta", False, False, initial_weight_v, @@ -231,7 +231,7 @@ def momentum_z_compute_func(out): ["p"], LAYER_NUMBER, HIDDEN_SIZE, - "swish", + "swish_beta", False, False, initial_weight_p, diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index ea49b4293..d0c9ab1d5 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -19,7 +19,7 @@ import paddle.nn.functional as F -class Swish(nn.Layer): +class Swish_beta(nn.Layer): def __init__(self, beta: float = 1.0): super().__init__() self.beta = paddle.create_parameter( @@ -32,9 +32,13 @@ def forward(self, x): return x * F.sigmoid(x * self.beta) -# def swish(x): -# beta = -# return x * F.sigmoid(x * beta) +class Swish(nn.Layer): + def __init__(self): + super().__init__() + + def forward(self, x): + return x * F.sigmoid(x) + act_func_dict = { "elu": F.elu, @@ -44,7 +48,8 @@ def forward(self, x): "silu": F.silu, "sin": paddle.sin, "cos": paddle.cos, - "swish": Swish(1.0), + "swish_beta": Swish_beta(1.0), + "swish": Swish(), "tanh": F.tanh, "identity": nn.Identity(), } diff --git a/ppsci/solver/train.py b/ppsci/solver/train.py index 8123d01dc..d20cada0c 100644 --- a/ppsci/solver/train.py +++ b/ppsci/solver/train.py @@ -92,16 +92,17 @@ def train_epoch_func(solver, epoch_id, log_freq): else: total_loss.backward() # import numpy as np - # dir = "/workspace/wangguan/LabelFree-DNN-Surrogate/net_params" - # bias_u = np.load(dir + f"/bias_u_epoch_{iter_id}.npz") - # bias_v = np.load(dir + f"/bias_v_epoch_{iter_id}.npz") - # bias_p = np.load(dir + f"/bias_p_epoch_{iter_id}.npz") - # weight_u = np.load(dir + f"/weight_u_epoch_{iter_id}.npz") - # weight_v = np.load(dir + f"/weight_v_epoch_{iter_id}.npz") - # weight_p = np.load(dir + f"/weight_p_epoch_{iter_id}.npz") - # weight_grad_u = np.load(dir + f"/weight_grad_u_epoch_{iter_id}.npz") - # weight_grad_v = np.load(dir + f"/weight_grad_v_epoch_{iter_id}.npz") - # weight_grad_p = np.load(dir + f"/weight_grad_p_epoch_{iter_id}.npz") + # # import os + # bias_u = np.load("./data/net2_params" + f"/bias_{epoch_id - 1}_{iter_id - 1}.npz") + # bias_v = np.load("./data/net3_params" + f"/bias_{epoch_id - 1}_{iter_id - 1}.npz") + # bias_p = np.load("./data/net4_params" + f"/bias_{epoch_id - 1}_{iter_id - 1}.npz") + # weight_u = np.load("./data/net2_params" + f"/weight_{epoch_id - 1}_{iter_id - 1}.npz") + # weight_v = np.load("./data/net3_params" + f"/weight_{epoch_id - 1}_{iter_id - 1}.npz") + # weight_p = np.load("./data/net4_params" + f"/weight_{epoch_id - 1}_{iter_id - 1}.npz") + + # weight_grad_u = np.load("./data/net2_params" + f"/weight_grad_{epoch_id - 1}_{iter_id - 1}.npz") + # weight_grad_v = np.load("./data/net3_params" + f"/weight_grad_{epoch_id - 1}_{iter_id - 1}.npz") + # weight_grad_p = np.load("./data/net4_params" + f"/weight_grad_{epoch_id - 1}_{iter_id - 1}.npz") # # u # print("w0_u is close:", np.allclose(solver.model.model_list[0].linears[0].weight.numpy(), weight_u[f"w_0"])) # print("w1_u is close:", np.allclose(solver.model.model_list[0].linears[1].weight.numpy(), weight_u[f"w_1"])) From e8b53e2279e69c1c11e6de04a44cb0129362477d Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 5 May 2023 09:26:53 +0000 Subject: [PATCH 06/31] clean pipe flow code --- examples/aneurysm/aneurysm_flow_FCNN.py | 205 +++++++++++++-- examples/aneurysm/single_test.py | 23 +- examples/pipe/bug.py | 65 ----- examples/pipe/bug_1.py | 96 ------- .../pipe/output_pipe/checkpoints/latest.pdeqn | Bin 96 -> 0 bytes .../pipe/output_pipe/checkpoints/latest.pdopt | Bin 139262 -> 0 bytes .../output_pipe/checkpoints/latest.pdparams | Bin 67170 -> 0 bytes .../output_pipe/checkpoints/latest.pdstates | Bin 45 -> 0 bytes examples/pipe/pipe_post.py | 140 ---------- examples/pipe/poiseuille_flow_FCNN.py | 244 ++++++++++-------- 10 files changed, 330 insertions(+), 443 deletions(-) delete mode 100644 examples/pipe/bug.py delete mode 100644 examples/pipe/bug_1.py delete mode 100644 examples/pipe/output_pipe/checkpoints/latest.pdeqn delete mode 100644 examples/pipe/output_pipe/checkpoints/latest.pdopt delete mode 100644 examples/pipe/output_pipe/checkpoints/latest.pdparams delete mode 100644 examples/pipe/output_pipe/checkpoints/latest.pdstates delete mode 100644 examples/pipe/pipe_post.py diff --git a/examples/aneurysm/aneurysm_flow_FCNN.py b/examples/aneurysm/aneurysm_flow_FCNN.py index 14b26e9b3..c75fe7ac3 100644 --- a/examples/aneurysm/aneurysm_flow_FCNN.py +++ b/examples/aneurysm/aneurysm_flow_FCNN.py @@ -11,7 +11,7 @@ from ppsci.autodiff import jacobian -def ThreeD_mesh(x_1d, x_2d, tmp_1d, sigma, mu): +def ThreeD_mesh(x_2d, tmp_1d): tmp_3d = np.expand_dims(np.tile(tmp_1d, len(x_2d)), 1).astype("float") x = [] for x0 in x_2d: @@ -116,7 +116,7 @@ def momentum_z_compute_func(out): os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") -output_dir = "./output_0504" +output_dir = "./output_0504_debug" ppsci.utils.misc.set_random_seed(42) # initialize logger @@ -124,31 +124,25 @@ def momentum_z_compute_func(out): core.set_prim_eager_enabled(True) EPOCHS = 500 - L = 1 X_IN = 0 X_OUT = X_IN + L P_OUT = 0 # pressure at the outlet of pipe P_IN = 0.1 # pressure at the inlet of pipe rInlet = 0.05 - nPt = 100 unique_x = np.linspace(X_IN, X_OUT, nPt) mu = 0.5 * (X_OUT - X_IN) - N_y = 20 x_2d = np.tile(unique_x, N_y) x_2d = np.reshape(x_2d, (len(x_2d), 1)) - nu = 1e-3 - sigma = 0.1 - scaleStart = -0.02 scaleEnd = 0 Ng = 50 scale_1d = np.linspace(scaleStart, scaleEnd, Ng, endpoint=True) -x, scale = ThreeD_mesh(unique_x, x_2d, scale_1d, sigma, mu) +x, scale = ThreeD_mesh(x_2d, scale_1d) # axisymetric boundary R = ( @@ -161,7 +155,6 @@ def momentum_z_compute_func(out): # Generate stenosis yUp = (rInlet - R) * np.ones_like(x) yDown = (-rInlet + R) * np.ones_like(x) - idx = np.where(scale == scaleStart) plt.figure() plt.scatter(x[idx], yUp[idx]) @@ -174,25 +167,14 @@ def momentum_z_compute_func(out): for x0 in unique_x: index = np.where(x[:, 0] == x0)[0] Rsec = max(yUp[index]) - # print('shape of index',index.shape) tmpy = np.linspace(-Rsec, Rsec, len(index)).reshape(len(index), -1) - # print('shape of tmpy',tmpy.shape) y[index] = tmpy -print("shape of x", x.shape) -print("shape of y", y.shape) -print("shape of sacle", scale.shape) -g = 9.8 RHO = 1 - BATCH_SIZE = 50 LEARNING_RATE = 1e-3 LAYER_NUMBER = 4 - 1 - -path = "Cases/" - -h_nD = 30 HIDDEN_SIZE = 20 index = [i for i in range(x.shape[0])] @@ -245,8 +227,6 @@ def momentum_z_compute_func(out): np.load(f"data/net4_params/bias_epoch_0.npz"), ) -h = None - class Output_transform: def __init__(self) -> None: @@ -331,6 +311,181 @@ def __call__(self, out, input): save_freq=10, log_freq=1, equation=equation, - # checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/pipe/output_pipe/checkpoints/epoch_3000", + checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504/checkpoints/epoch_280", ) -solver.train() + +# solver.train() +def predict( + input_dict, + solver, +): + for key, val in input_dict.items(): + input_dict[key] = paddle.to_tensor(val, dtype="float32") + evaluator = ppsci.utils.expression.ExpressionSolver( + input_dict.keys(), ["u", "v", "p"], solver.model + ) + output_expr_dict = { + "u": lambda d: d["u"], + "v": lambda d: d["v"], + "p": lambda d: d["p"], + } + for output_key, output_expr in output_expr_dict.items(): + evaluator.add_target_expr(output_expr, output_key) + output_dict = evaluator(input_dict) + return output_dict + + +def single_test(x, y, scale, caseIdx): + xt = paddle.to_tensor(x, dtype="float32") + yt = paddle.to_tensor(y, dtype="float32") + scalet = scale * paddle.ones_like(xt) + net_in = {"x": xt, "y": yt, "scale": scalet} + output_dict = predict(net_in, solver) + np.savez( + "./" + str(int(caseIdx)) + "ML_WallStress_uvp", + x_center=x, + y_center=y, + u_center=output_dict["u"], + v_center=output_dict["v"], + p_center=output_dict["p"], + ) + return output_dict + + +scale_test = np.load("aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")["scale"] +os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") +caseCount = [1.0, 151.0, 486.0] +W_ctl = np.zeros([len(scale_test), 1]) +W_ctl_Ml = np.zeros([len(scale_test), 1]) +plot_x = 0.8 +plot_y = 0.06 +fontsize = 14 +axis_limit = [0, 1, -0.15, 0.15] +path = "./data/cases/" +for caseIdx in caseCount: + scale = scale_test[int(caseIdx - 1)] + Data_CFD = np.load(path + str(caseIdx) + "CFD_contour.npz") + Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") + x = Data_CFD["x"] + y = Data_CFD["y"] + U_CFD = Data_CFD["U"] + U = Data_NN["U"] + n = len(x) + output_dict = single_test( + x.reshape(n, 1), y.reshape(n, 1), np.ones((n, 1)) * scale, caseIdx + ) + u, v, p = output_dict["u"], output_dict["v"], output_dict["p"] + w = np.zeros_like(u) + U = np.concatenate([u, v, w], axis=1) + + # velocity U + plt.figure() + plt.subplot(212) + plt.scatter(x, y, c=U[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.colorbar() + plt.subplot(211) + plt.scatter(x, y, c=U_CFD[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.colorbar() + plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.savefig( + "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_uContour_test.png", + bbox_inches="tight", + ) + + # velocity V + plt.figure() + plt.subplot(212) + plt.scatter(x, y, c=U[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.colorbar() + plt.subplot(211) + plt.scatter(x, y, c=U_CFD[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.colorbar() + plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.savefig( + "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_vContour_test.png", + bbox_inches="tight", + ) + plt.close("all") + + # wall shear stress + Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") + unique_x = Data_CFD_wss["x"] + wall_shear_mag_up = Data_CFD_wss["wss"] + Data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") + NNwall_shear_mag_up = Data_NN_wss["wss"] + + plt.figure() + plt.plot( + unique_x, + wall_shear_mag_up, + label="CFD", + color="darkblue", + linestyle="-", + lw=3.0, + alpha=1.0, + ) + plt.plot( + unique_x, + NNwall_shear_mag_up, + label="DNN", + color="red", + linestyle="--", + dashes=(5, 5), + lw=2.0, + alpha=1.0, + ) + plt.xlabel(r"x", fontsize=16) + plt.ylabel(r"$\tau_{c}$", fontsize=16) + plt.legend(prop={"size": 16}) + plt.savefig( + "plot/" + str(int(caseIdx)) + "_nu_" + str(nu) + "_wallshear_test.png", + bbox_inches="tight", + ) + plt.close("all") + + # x_centerline = np.linspace(X_IN, X_OUT, 100, endpoint=True).reshape(100, 1) + # y_centerline = np.zeros((100, 1)) + # output_dict_centerline = single_test( + # x_centerline, y_centerline, np.ones((100, 1)) * scale, caseIdx + # ) + # y_cfd = Data_CFD["y"] + # index = np.where(abs(y_cfd) < 0.001002) + # x_cfd = Data_CFD["x"][index] + # p_cfd = Data_CFD["P"][index] + # index = np.argsort(x_cfd) + # x_cfd = x_cfd[index] + # y_cfd = y_cfd[index] + # p_cfd = p_cfd[index] + # plt.figure() + # plt.plot( + # x_cfd, + # p_cfd, + # label="CFD", + # color="darkblue", + # linestyle="-", + # lw=3.0, + # alpha=1.0, + # ) + # plt.plot( + # x_centerline, + # output_dict_centerline['p'], + # label="DNN", + # color="red", + # linestyle="--", + # lw=3.0, + # alpha=1.0, + # ) + # plt.xlabel(r"x", fontsize=16) + # plt.ylabel(r"$p_{c}$", fontsize=16) + # plt.legend(prop={"size": 16}) + # plt.savefig( + # "plot/" + str(int(caseIdx)) + "_nu_" + str(nu) + "_center_pressure.png", + # bbox_inches="tight", + # ) + # plt.close("all") diff --git a/examples/aneurysm/single_test.py b/examples/aneurysm/single_test.py index dbf9d393a..24bdf9c29 100644 --- a/examples/aneurysm/single_test.py +++ b/examples/aneurysm/single_test.py @@ -1,26 +1,27 @@ +import math from math import pi -from math import sqrt import numpy as np +import paddle import torch -def det_test(x, y, nu, dP, mu, sigma, scale, epochs, path1, device, caseIdx): - +def det_test(x, y, dP, mu, sigma, scale, path1, caseIdx): R = ( scale * 1 - / sqrt(2 * np.pi * sigma**2) + / math.sqrt(2 * np.pi * sigma**2) * np.exp(-((x - mu) ** 2) / (2 * sigma**2)) ) rInlet = 0.05 yUp = rInlet - R - xt = torch.FloatTensor(x).to(device) - yt = torch.FloatTensor(y).to(device) + xt = paddle.to_tensor(xt, dtype="float32") + yt = paddle.to_tensor(xt, dtype="float32") + scalet = paddle.to_tensor(xt, dtype="float32") xt = xt.view(len(xt), -1) yt = yt.view(len(yt), -1) - scalet = scale * torch.ones_like(xt) - Rt = torch.FloatTensor(yUp).to(device) + scalet = scale * paddle.ones_like(xt) + Rt = paddle.to_tensor(yUp, dtype="float32") Rt = Rt.view(len(Rt), -1) xt.requires_grad = True yt.requires_grad = True @@ -40,9 +41,9 @@ def det_test(x, y, nu, dP, mu, sigma, scale, epochs, path1, device, caseIdx): + 0 * yt + (xStart - xt) * (xEnd - xt) * P_t ) - u_hard = u_hard.cpu().data.numpy() - v_hard = v_hard.cpu().data.numpy() - P_hard = P_hard.cpu().data.numpy() + u_hard = u_hard.numpy() + v_hard = v_hard.numpy() + P_hard = P_hard.numpy() np.savez( path1 + str(int(caseIdx)) + "ML_WallStress_uvp", diff --git a/examples/pipe/bug.py b/examples/pipe/bug.py deleted file mode 100644 index eaf611edf..000000000 --- a/examples/pipe/bug.py +++ /dev/null @@ -1,65 +0,0 @@ -import os -from typing import Dict -from typing import Tuple - -import numpy as np -import paddle - -from ppsci.autodiff import jacobian - -if __name__ == "__main__": - paddle.seed(42) - np.random.seed(42) - os.chdir( - "/workspace/wangguan/PaddleScience_Surrogate/examples/pipe" - ) # working folder - - open_bug = True - if open_bug is True: - from paddle.fluid import core - - core.set_prim_eager_enabled(True) - else: - pass - x = paddle.to_tensor( - np.array([6, 6, 6]).reshape(3, 1), dtype="float32", stop_gradient=False - ) - y = paddle.to_tensor( - np.array([6, 6, 6]).reshape(3, 1), dtype="float32", stop_gradient=False - ) - nu = paddle.to_tensor( - np.array([6, 6, 6]).reshape(3, 1), dtype="float32", stop_gradient=False - ) - input_dict = {"x": x, "x": x, "y": y, "nu": nu} - - weight = np.array([1, 2, 3, 4]).reshape(4, 1) - bias = np.array([6, 6, 6]).reshape(3, 1) - - w_para = paddle.nn.initializer.Assign(weight) - b_para = paddle.nn.initializer.Assign(bias) - - last_fc = paddle.nn.Linear( - 4, - 1, - weight_attr=paddle.ParamAttr(initializer=w_para), - bias_attr=paddle.ParamAttr(initializer=b_para), - ) - - def concat_to_tensor(data_dict, keys, axis=-1): - data = [data_dict[key] for key in keys] - return paddle.concat(data, axis) - - def split_to_dict(data_tensor, keys, axis=-1): - data = paddle.split(data_tensor, len(keys), axis=axis) - return {key: data[i] for i, key in enumerate(keys)} - - def forward_tensor(last_fc, _x): - _y = _x - _y = last_fc(_y) - return _y - - output = concat_to_tensor(input_dict, ["x", "x", "y", "nu"], axis=-1) - output = forward_tensor(last_fc, output) - output = split_to_dict(output, ["v"], axis=-1) - _v = output["v"] - d_vdy_paddle = jacobian(_v, y) diff --git a/examples/pipe/bug_1.py b/examples/pipe/bug_1.py deleted file mode 100644 index 149bdc5a9..000000000 --- a/examples/pipe/bug_1.py +++ /dev/null @@ -1,96 +0,0 @@ -import os - -import numpy as np -import paddle - -import ppsci -from ppsci.autodiff import jacobian - - -class My_PDE(ppsci.equation.pde.base.PDE): - """Class for navier-stokes equation. [nu] as self-variable - - Args: - rho (float): Density. - dim (int): Dimension of equation. - time (bool): Whether the euqation is time-dependent. - """ - - def __init__(self): - super().__init__() - - def eq_1(out): - y = out["y"] - v = out["v"] - dvdy_paddle = jacobian(v, y) - return dvdy_paddle - - self.add_equation("eq_1", eq_1) - - -if __name__ == "__main__": - ppsci.utils.misc.set_random_seed(42) - from paddle.fluid import core - - core.set_prim_eager_enabled(True) - os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/pipe") - ppsci.utils.logger.init_logger("ppsci", f"./output_pipe/train.log", "info") - - input = np.load("./data/input/input_x_y_nu.npz") - x = paddle.to_tensor(input["x"], dtype="float32", stop_gradient=False) - y = paddle.to_tensor(input["y"], dtype="float32", stop_gradient=False) - nu = paddle.to_tensor(input["nu"], dtype="float32", stop_gradient=False) - - v_dict = np.load("./data/compare_4/v_epoch_1.npz") - y_dict = np.load("./data/compare_4/y_epoch_1.npz") - dvdy_dict = np.load("./data/compare_4/dvdy_epoch_1.npz") - - initial_bias_v = np.load("./data/init_net_params/initial_bias_v.npz") - initial_weight_v = np.load("./data/init_net_params/initial_weight_v.npz") - model = ppsci.arch.MLP( - ["x", "x", "y", "nu"], - ["v"], - 0, - 50, - "identity", - False, - False, - initial_weight_v, - initial_bias_v, - ) - - eq = My_PDE() - interior_geom = ppsci.geometry.PointCloud( - coord_dict={"x": x, "y": y}, extra_data={"nu": nu}, data_key=["x", "y", "nu"] - ) - pde_constraint = ppsci.constraint.InteriorConstraint( - eq.equations, - {"continuity": 0, "momentum_x": 0, "momentum_y": 0}, - geom=interior_geom, - dataloader_cfg={ - "dataset": "NamedArrayDataset", - "num_workers": 1, - "batch_size": 128, - "iters_per_epoch": 10, - "sampler": { - "name": "BatchSampler", - "shuffle": False, - "drop_last": False, - }, - }, - loss=ppsci.loss.MSELoss("mean"), - evenly=True, - weight_dict={"u": 1, "v": 1, "p": 1}, - name="EQ", - ) - - # initialize solver - solver = ppsci.solver.Solver( - model, - {pde_constraint.name: pde_constraint}, - ppsci.optimizer.Adam(5e-3)([model]), - equation=eq, - ) - - # train model - solver.train() diff --git a/examples/pipe/output_pipe/checkpoints/latest.pdeqn b/examples/pipe/output_pipe/checkpoints/latest.pdeqn deleted file mode 100644 index a7f5b73983f0e5e79b0fb234db7a0b869fe6f967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 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 ~M 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 D47zo# diff --git a/examples/pipe/output_pipe/checkpoints/latest.pdparams b/examples/pipe/output_pipe/checkpoints/latest.pdparams deleted file mode 100644 index a270dc635891df4fef5831f7c6c7dab4d2d6b8a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67170 zcma%hc{Ei~*uGgPlp&HK8KP1`rhE5(FQQT^A({-8(m)|aWS&X`ktCE7rIgTsd-i*! zQK&Sac{Zd;v((S`eZTLo-+0biXPvdqK5Omstn&`f^FDD>ITysm#s1@n$)1p*y&+`f zs`b9>gTlhirkbq}3SQ+O8a8ydWmVAXHR0JAYQdW~Y>YHp5fZw}Y{TaD;X(ePq5hHC z8N+=;SFH#M4hs+6ydpe%Uv`G{e=f|UrY97yNV@eJBkNnr)IlnPjD4?m2#by zlD$ScLwaR+N9UgyYW_b8_bn61*S9kJ~YeUmh`?>#_{wuU~(k|KPO^ z7q{mS9~0IJCm7rF&!$;$$1|6cy^m$c*#}abSi=wggK0tB^vFfz(ZC39)H5%V@iOsEOt1m*!qkH-1CEbboyI}5Yn2k$= zi%FbNo{vX2a$C7F?vlxFGG}+IaQ*gA{I<6#+|IlbF79d>=j^+d6Px5$uTXf5Ynrs1 zoIaODz8<^9zp121{00?yMjvfCvFK6!x0doGe{CU|uO`LSMW=I9bvt?G<~rQl`G+}6 zy9U1b&r;&7JDEElHjQf@%pr3o+~Y4iuuSN%obcbd$=7$;T&Z35VFNGm<@0(tvW6ei zCNGrJ7$Y3ikQ1)C_|#so5$(rEC-KgSt*hn0hd*(qqHtMRFR#Wlur4$0Do_9QsQS6z z+Ul#084EKNkJfi=H5Xb)oT`)dZL;swnIjAvD73G9aJoLh{XtzN&y|05<=@&VlKFP2 zcO-bbpLf=l%Vb~rX!-f#2ld{%MW?sc741j6sc}8_J`%>l!h*5L-tUlWN7^#VmTnlKP-EV)Ee3U2*@>Z{~eCv{~3-W(;crbd{a*1xa+>1V)WHl;k1CG+d&cLVRapwVuj%oY3T3Pq6cA>H?>@3sVM;^XG4}5(bxz6LuNc*%zc%+Z^9Ix9(3SR~I2A zB}85a|Mf*V;hxm0`nDf8?PkO&1 z{jWGo`=2;CC>x83eH^#_RB zNmS@~Ppzf*a3Ahy(zy#Bv%2+JDAZTPbq~Ly=bD!oVLzHFFPV%Hv(s^y+$$!1MG{AN zEW?q<>hPhCIWt{*8rv>z<@{R=@uKoDOxQ4j_i^0_99yv+rP93F&BHCi@WtY|++7^S zZzkdxX>E*tB*f35x=cyqGpozW$Cmnyv{{bB^I9)h!NDlh^K8PC37x#Wtt0T!d8Aj& zRnej^p7xHHpho_qFt3l&@=eoldW|N2DYeBvy#{!Ak2_eLh@)MyQgEVpF3nwNie{Fo zRA#C*{;DxV{uVPDvhf3p6dK?KMGJajOE4L)p^tvH=6K`HW*VVA9^Vcd19sh0>C&JZ z{5Sh=QZ@ONU4i*9{sCYd}aC|~E=tPIZCWR4#SDMxk-fWBW zjRffU*AX3ltwWx=15P;f1-*>7;(oU=qP5pdF|za-{*0^#WiRaUnVBUf{%sx01y9U}(&;2mY*m@Or;}rA? z%ff`>JNRXyH74%8!VGT3pqxV+_gr2Q>8Ec@EwzG;k<38f+_&t}p4aHN(hnc6Zeq_q zXJFAqZTwyG8=pjb;P-7y(P#ZH40N50I;E{bl}yR{-i;gRvB3iVfLtI~5I&5{cTVEg zC+gd)?0Z$$BGjmh)Y{Ga^K>dNeDM)3Gi5hdR~%aZ*vOBY^YbPdD~u4fbjy(EP5?T0~a%X0bs~ODa>ozr{ud8%udlyi*)Nu}NkwU-Z}UVtXW=FCE{Wqc|Inh6XCsJ) zj5WD7K2><*dnUiq>M*}OJ%@LAMmsSm9>yL{H{_=6NfMrp9#4((j&R>9?=!>ZjW~Jx zd3Gsg3;yh#g!u=G*xInmXyta7{dSiY&2d?b!n?ir_P}+#>$I8P5I*HTWu4+CTvWqz zCe^6ZZ-}RNDT?e*DTq|RE?|GP1-LQgF#1W4$DJR1@Rd>mt}B0z-qkPJ%8V9lj5^6$ z=er|)A;9U=x3b>Uu~?CrfqOrsvb72$*r?Jes4F=hw~FmWN%OI2eYFpzy~bkF{V}-H zpbD>Dj_38X_o0!OF}k`Z5AEv{I_kd_-ush+Hr?gihwaIjBwxU0ZA~ZFi`&pWZyuRc zp)7i@w+Um0{ljO54=_^d3hmr=j>=l(Q{V0T*<((G>-l?`L6E+vaix-|#M+kbu1dsJ zvKNt%BzDi_2-{$=7r(9fhZ1!+xF^*wQD0s_+8_R4ukDsH*%V3sbjukSR$YjyBcC%` zETGJ8F@CHmLQ9jgc+G;1;lP{8O%pq%TsN%g#^d$)A|Q4~>1mx7xf{_-t$@-(y}UUpB~z82>uU7ry-_ z^l_2q4Yw8Nu2_60*VLr>PuK3}))#)^0-q=d1FMql|DDVyvKj*J5H;Y6)ze6Rb}_l) z_LVE&GK7(gB|GsllY2bt3U}QogM0qbo3yO6BxOej>Xo%PqN28ii^?(~lFK}ZLiu#U z$vBZ2&hLaqyb+`^$Bv({MvfGD#tZMud2s(q1;lOKM(%A^qR?)IoSoG0r`>& zjJzl(>eZSh;6)80zH$>3^~neh?zIqzJS_wdem=ylj!GhFvEMi`uMMl_=?Th9n{mrY ze}VS#*#eEI4=Bx37kG7P2nKCy(09foJY}ybxLE5ZQ2728LkesJI~DiQ{t?&F?#4qL zAkC;B*9(PLh6&O=@4-23EfG%o2=*?%g1D2Kf&{bopyqEQ&_8ztcSZhy`z?Bc4jXZi zaIuTv-@ZzWYS0iA?w%+(A0Q{nla_~Nj{yG71E}~r8S4D?V9nqYI7J-cSJXRjQ@KkA zX#<=!*$E}OJ~Tzy8@6s53E$sLfCsyl0B_hlnBOQPSl|2&R=@X!^M4y?m7Eo*$W4cA zbb>c}x-h1!6n55nL2c;)IJ^2ewBCva?b(}Qm0$qUd=3&`GY5b|M6dmTbv!sI=Y^Kgvoa@xc!t_){ z%f5P}f520;|8xz_J>{tMhF+$#-IBez_=|0{%g5XE^svxQTXe)pRiyLkJp1?C15YSq zqe1>#MvKPa;)`);dFcrr*8R$q8d@-b-^JePt;QI|?PwDu$y7dnWxrpg93gm5A0{EPk9(fmwPRP=3o}G-yah=lEO5?Xt!; z;VE2LbsH}(nSt3GByrn|2-Nu8%E{D^N4wK1IR2yp{>o25A9HzhlYfCyx~s9ILkH`Y z6yneEmYCw#i`x8njB5!;;p+Ej_lIC`lZdbG&Lcm>8mXA70zEgWn{#t&;EED9bFuw5 zgpYzd_`|LwbMFU^3l}{zCsETRnCG#5+|J__WOi2>&tg6$$F$z^u4qgbCY??es=5ym zzwKH4vu|^_c)c_(<4Y2`CTqfFyA6;v>+HBMW7L_@!;rq0+QnubUd{#BU*hI!X%V}q zPJW7!Enjbo4&A=`0r&n!0Lcq&=A!l;sEhb3C4B4TL`F+XbMIZJaBEXXb2C+cl7kZC z$x`ze?$19zuHr^BK_`E9V^#ra4m(7~&n;uiMo(sv;``W%rr~Uy(=?*O74inWKar>Q zl620*LZ(^$gcHa`2$RG7shL3^r`+MmOs5*MljR?n#f}1!{ZfSr+GJV$gn!KQ@fPB? z8HK~ntYbY=iG0OdQaJB&75A(}96hTiFo&th#iktqa*nXjvV6N90(>m7Zeb3QkD%Di>!6@crDDmpHE~8-ty_c_pByI9@|wea=%`w zV@%CLGPfy-XuVp9v6H8A-663UKBN7l@xN<_GHo*8+NcS(m8DL2|lLZEn&8cSK^M~o#ar)de(J^hd)X# zQd7l^IK%rnw`8ctF^pP;%Lmly&(k&->g&t$%EsWIGvnCh6K8}!Z^mI}ULR*(SB!6M zhGW{J12}(9JYE_-0rJB~a3PM{=(-TXJif0%UB4`5_q!MsSD!>Dxd0AKm7Cddt)HZ1@m*$b<%|!=Gj9BxY?8jL znti`}l)3o(BEP7K-8py=3(F%o56_)!?YwY2{^Xf_b4#>yXCqpi5RQnDS z*WaRR#*7tgmlzB4V+Nqa@CHmT_98_22QBO9qb|!V;D<#nbZi_4S6Ao=e3$A7KDOVZ zY(oX80?5K#`1w>m=mAOrT$h$rQRmyotQ=Y zRBUkA-s4Pk_bPj`U=AC3Mhq>hrva zZP~S%BJR|Nt*q+yS?=NCYI1wwSQ7QIf&A9bBk}R$*_DfygncaG_LN>DGfU#Ro79kH z+-BVNn{jN6rjc;1N-?3rk=)(>Tz2$iB)R-no0JHia3-B;q$NCo9scr~t8gn~N_Kus zZRG)y-u8?q>C7kFtwTA(*H3w6HAQ^CE^Tu3fDZZkc?gui8Qcq}U;Mv5r6fk>qp;?~ z$@*i*+W3JZ9`j#)nnLV!Em_i@0oLw14Gq$5@VKV|el|77@pT7 zn}%K~-dJ$Uo~fMMimU&l~;we*{W~qrrTlS#;JqxUyAcONq6`^hCDztmFs4g(@ zI49c>#z~2bbBZC?xfzkCxOk;3?*70AURS|lvcI{WKUZ-Cxtowx+h3%`{3Ei2cl))t zJJSykeMwKAt$`}}Fsq$EMYo9S`<1~{3VgzktK7rtyMh zlD?p4_KwbM+zED8%faGb3RG6k2Jsz3J#J$h?3R51>hU85RhM&MLRdNcwsU~oy316# zd@Y1-u_Ujj@*(%!ciMM7i+=hP1^r&_9bj6_H`VC{f~tAbe0c6OWiB;V$d#X#T7MqniWq z{MF~^Ixiiszi%Dl5ktDn+cUT_u?aOExnO<2Bt{m;;+K*-Zbhyhk_Xzj*+vO#8g^pR zS9$c7eTJHDz8LAJhx^J4P`1eg$Mt-`OPAK+e&fyPcc~jaBJFU~=RB_B!B+mu=qYU6 zpcgslIftGTw>!#kEmMT1(;2;Aetwj*MIqge~==WN}9t+@p&*})+~5?P)s29_8T-RdqU>8D|Fik zJGlQ<8=4Coz+~Q7Sg@oR=A2jn`bN2MajDhoR1@z8?dB8uQ4t~B3&>?LN$rgsNE#oTq8LWWt zDJP)YwvdiFbrc3CjirBX+-ECRmVL2YN81^k= z!~A2Ywd4ypqHRhOb~y^Z=S~x-EKy^7RrBDU+--0Okte&3^^p8Cm*MVX6~UVi3EZvN zVS;L%Zy=-klU`G(q1W>V>lY=(!+rk?u=TP6h$Jl8ciA*JIQ1wbr9A-VpA3^?R0W!U z_{3T}2NVb1fzwtucE?vwP-zuHm5i^zk4O!{I!O(d{>KugobZGoxlPa~>kFU}Y}}<$IpOfpvAzAXY@JvX+Bxz5#e%+6;ehrNT+&wJ_zLrXX~$rXWDd z7DSvFe6$LNy;nVo!5D*aFac z`U6r#4$!}P0Cb8&@GJib$h=*E@A_*n_25FmKbvyA(>GJFpz}NE``8P*ubT@v*}b@@ z_Y%5{IE5Z7LvY}?uE77xRxFoy7onPT(c$@#WCzN*H?qm(Qv24yo3GUO`Q$)^Nn^o@o z#{6I1V2aN_Fs18wK|LaL`mhE4?j7b{Dvm>#ZHSqN zl+l2ffh&hN?`M32S~ph@@tHB`aWfB#rKaJ|lwLd%8;gJT#o+C>ZfqFf;R{VWJg40y zRK0G36_!n0UrZ)>?GS@856^IXzhb-`sg0kcvT?sb41S)@htB3Qa;o$M)zpw+Pj@ZB zhe1iKy15v8rj?=QaVxS)B!TJTPhvbI;Q5LrJ3M(6$FKHJKunh5Btn$bujfUB*drlxO zr5!Y?Hy733Z)4Mo+)#t$;t%IB^!&xic+@>m82`y0r*zn{!BLGQO?C%1=PTvI%TTTSYH_D*VD+g%N2qU|Obh)S&xcMW8>h2%Pr4P45<-C5*HiMNaZuVsheyjos%^h2D1;-TceLb_}{Ux zD$I&1ZMB0JVWS~iwH%Io84Xmui%z<53YL|5gMYmvT+W&gH4R~~xo!n)*&q!w72ZR) z%xtjiA1UzRsleHn-@r?F6Lu-4(Ue8=pt8pjrcPW2?=ud<=)E(c_J@u@Z=06D$;t-q zm#M&bw;0G+>;kXlx5Ds0-k>Z07H%E#hIgkQ!U3u**qprw_^G*Y)X5C4SQgW?8v#&b zo=IS`Iymq<5$sOe z1fO&6LCO;)fxK%b_!k`oPR9l=k(2b)#t@KiT~DNqCPJCFBCI}8Pi6O|K-i)?H0Z=2 zEb8@ytqPKmG5!!dc{Lk63Z(?*VJXmRy$%kYkr0S=&j9&JhLB*m7VeJQ3P0*rL0;Mj z_%`Ve%z4R!h6H7SQMoQ$4tfi%xph$AeuT>GS_YbG+OSv<00CaRA+u;TNEWIK-W(V$ zs0p!!Mwej_-WUL*wH=`NdN@SuEP^J9HrVuN1#~B#hc$)61bR|?Kj6BNL4%rI!V)=Pztqu`D74Qkub3vM~~z;}L4=X^vn#HXiqJ&iXfl*fax*VE*!<<{-y9*;r_b`&@3j*?H+E#> zrDqbc-&vfJm6wpGwV%sgn9Oz6UlOYQ>*i*!&gW#Ns`B#=IT5wp)qHa|2Qnw2k8j(e z&-r`g^A+=UaGIWHICmLEVRP(3va{ESG__w7`kX(`MH=Xl<}JthRj(L7u4O!nd@vVN z?PGD)W^Y{R8jD9HSEBZ)RxFi_L;H2|qNhKcvE^njaC&D@dJPIDP?_ zZ!^K5zlU(u#a-Cwqywv#9pif{7tmadbmsOx0oQjA)q+PNY|FohHB+>?&)*a<{r4)g zoqduuue`%tU1#F6)%)?Rl^#nyu^XjM#BnW50mYZxX9EvUk?n@s8~Bo%RCe50F+ta;0K?owk1XTJD7U-r8+Nz1>=IrQyfYlak>bGKB;%9KdH z^V3uO>MJ=cA-RjcQMG~vDhy|dk>&NcDump*s82Q$ z_4l>>gbIr0q5#oxz(s0A+cX;WWRBPL;}n-X1?VB_B%%V`f8FwFZzoCg6B~3S6FU1{M<^g2d)_ zxU6jpaz{^72g4EYq}~$lZX>X?;5l7omIRB#W`cW25ER|I3qA||VUbD{INK|L+1^!D zvr!sm{ixu=@7L40CDZ5*OrR!;;t>5OonDa6gERMr!Sf3f>9L(ApnX*df_@i3V!k4T zT8e>5SS6@FcY(j&yRf_f*ztK0Skc$UUQCxD3$yOvdnXSf$WRxRZH&WkYblYu#dCC2 zeoH%h7?m&#rtkX?vUnkfU$&oQpNxz|&El$}D}r81t@kv9zCK@gqOlt0IOcgr4 ziGsVJfGYo52nP4G$oe{a_;&08eO*E9K5o$UP+Ir`pSi<%lP zV0+?6VEB;VVN|UVd!8B3Cg-JcpIb&@=JEt~aI6mUqwJa8Oi7-9Sq=#c;?dn+H@LIE zEy=WMank!*S~#-rC;w2+3T}$*7>?VU$f^HcLDY^#vKZA*+zjghVU^Y_lIv)}wwbD; z?lwJ0m3M_3a0-5e;+nfW5B@a$ zqvj_g;O~4xSYvVA@IGja6#DeQG2V@^>M@XO6j*!}J+3F;n68oC{c zt%W=%ZFY{juRB5q*Z$(1%ZmB$RCe=&?^|#|@;zLK(k>ag_N zRL<@GQ|@q6CpkTW5W6A)Uszj7uMJHMjcy$$>q`gu-)qeI+xl(DhjX@6qH`Y!K6r#| zlb$og;J=gptc8>gbn-Vf9^joA=0p!S7_$G1v2fb|r?IeiY6h!5ZO3Gu#?W^QZ_zBN za2EADTUd7CDPBD;i^^j8+~k3g!je9J;n9zkP(8bm2K0}F`Z|B+G5!~pt;+^xT1BTD zZsV{0Qc5F+j3*z0GibAfHvifJ0~%*CgH7^$EmYC{$v>Vn4SE&?f@{4b`PTcGN(?_u zJfF>^#^2lNYc)F<^--Mt49bOHUPESt+YS8M$QW+1_k6xu^c;wJs*2mfc+~&kKcW4n zN5UKGyCCRDI9>X1sc`20PpHtO&KB9kGh@SY8WK7d*ZtVRMoP^Z~m2MjeDB?qz zX%>-lRK=i?JLs>jaO$Gi%WOLm*}?Epcyw1b(@o8n9N=IWwBjwZ?$T%|>R zc{IN=nI19Gq6tP<=)Q3u_*zfS3#W%B!TaWi&@B-~OLM%qVO#gXjjtA@U`GkfG%KNd z-d$%B2UN+O1{e0~{2Tsd&&ljSnLXUC@}={`XY<6kl(0GhbnBA=Mu3 z50;bC_{OuB(aseSMBmPgbVWPT#Kv!2ih&Fq49q8eZ>8w71rg-a$mevf?h*UPrW2vS zO;WH?b`Ol`Kg0h%Hilg_P2kR%?jVoWp5RZ4s$%bBSF_ZMPg!Y7Jmu$HW51s%VYpd8 zTYq&j`ljw7FHH8*r%PrMsitC9o7qI&zi#LMw9aH3M-RtS3rtb(t15ddxskPR3`f80 zC1lSh2^!+zL(`gsY+*+V8C`CIIe)v^1YbY&Nx#QkI=FNG7rp1x31Zod#O>m$Q;tf7qw>8BEQKQ9q>~`fy|-)m3d`xdrib z--MUk7aK7Yzn99=Oyk+`iYdYina9}8q-5-o3E~1357GY3XGyeT9lNyVFnxLPJo`c3 zvYKz%`5a*pOGNEtHmy^+C~(>^F8HXFac31q4!1$3r(x^N#(!e;{y*{zhf zG*F|RU7IUO;xnevKZ6ITn#&6|E~=ba51Dw>O6$2#ir<-KZVsF9Lr(Cxb`X63R-nzf z5}KziCUBV6OBNDq*s>l3CjOOzn1&Ycx2Pu%uP%p_i61e{>@u~QBq2zBbCXszj1yhu ze?k3jN|$*4K}&B1!GzFil%Azd12#Irwx<$;gum~IcBA=6ASJ`U)| z;eiayTj}?pCwQpUo3@K4K=It6p@081wu&7i?Gse-n)PQ^>S};x#*f*b*c3WyMhq>z zx|UuX{*HBA%%KkFJ_%*d{9@bvkp-VhS^Svzwly4!GY4m{GhkDn43-!O^qvsc@3m_umu*M4g?Qj;TWW4~-XHw{Wx)d%xKLTqLuaMp|V{pObQocD?3^qr`h$hs$ zVV+`@BqGBT;)~?rBW;6}W3n{XGeLyEW!V+nTsJbpo}MyoqRJl%gs&}LkVc;tT-x}S zZ8iy@A1jUt3qPJBe_e+}FWJTPPmn$+*W9fy^6x>n9RjGG$fxIn=F+XnvDB+4guRTs zM6S=NA$3DTgSJD!O?dR3Ebjh6G*6C!x$p8|&`yeGER}#q58H|M^8^~c{}Gh{8OWPF zlUq5?AC|VBrc3W!C+~%F%+K~KnbT_v_Y zm4QLaBNDE&O5{A$%-giq1NJYVKQCQ`^ap8ZcP$($muc|>oE&jhVic*ry_2jS{esj? zyazOGHf@v=lEUJAh%A0bWNk$BQA8A&6*WNhj8>L3ISppm%?6wL#yUyO7tCYAH~!a+ z`7l@c7aAlNv-)*H5-@=WZ(V*<4~xT4v~L+v3wIYSzGX~s=6Wv3Z7gtYnNYlED|gcP zDe)5HiRN5CfChRpcxKa1=4jl@FTNZKV%$c!zxfdSz4?Tj-Y`RC?6U{%zt4lDBW85= z#JwO&^1%ysli)@6WYX5Bf^w%@dHy_GvcXD|t~oD)ds68%-9U$=s%!?sf@X4TK@qhK zSqi>0D_~p6LpJ(R5IF3d3_CsN@|OI|W1CnDu_D<}JEIPFR#~%iQ%94%4RX-sEDbXj zy2GUV+5CT_r-*KipNy(~%h98!fiCIZh^appptxBi@?vA@F)1k&?0v;fpZUyu8O85@ z=UAxRBWhsdf*zLP*lF{GB(MsSAtnY#y@km4%csv2nplNhBfbA*4t|(ohJU}sVA-^V znC)MVA5j)tBS+$d!em@+w+K}%=Hr&cay&V~8U2ST&|+VG+z_@`_{z8dv-)PB*R8iq zXgm*H25Q-;FKIaH(|4xhD!}K5bx~+wgat_*v{QF3>gjGFe3fnN#G#K&A}o%qm32Vp z(BbH2B!{W@ZnB6YRaDJ<6E*s_omTU!+0W#BYGc?k)Z{p#Hd)E86(kNBgG#u}?OH6@ zz6AaEE#mlYi|BgI9b{{{7}fyLrJ|8IPE`^|8tfPn^gGCv5kKHQ9%_d+nAi8A!yxh zVJ2^z*r?_1XdQiyMVD@(zD3$NcTyH-s;-D#)4XxxEi>G^T^#M#y3uNBPnIA4gDGM& zvq{UNEA~8K-(>f5i;Imxe!*@U?(>rUUUrJP^8V61sz)!|3^L#Ks>uKKoLlPhnf>{Z zOtTN&XObdioOVSX57`@Gwbf!0pSP1%AN@#Nw-&PTk1Oe`Jq4ueKq?D(*va-koQQs} z+d1ymd+y|`K)m64fbZ_HiB`MGQFf(^_4P>;eN`=7FWtqCB& zo=xg1WN&V}(SiYg65e)`Srko2>zFhyZHzH{YW9rsUTuKs?+BaS)eB>ZCw1^6!O?$kiSyw4tw)$9+mknBp-s4 z+0|GZ{Bhg}@7~hn0;+2{CCen#+HSx-Ow8eqc-4~$t2>xK6Q@0XbeBC5Q@;Wpo+xKv^?zTYQJOPt3-zs?_UO>Tw!7B|>^FITiurU^WwWdz@hZ%|>D zoM7DKv-tZTLhCCF@~|o!EtCA=sB|M~UbB}TQhE-dJKvJVG(D=Y@h^N@W<}f6=Rj0# zIefMK2xD^oFcr&sIOp96**@FI{nd8(Ja{-gl~Dycdksb3VuztksXEOrSpip9DuUq3 zM|kx$pQw%8Bl^{GkCuGNpwCs$0hMflAC-6M4qa!`v2VZV#q8@C7IGBh;&l=C{N$Gz zOTptk{h)BD9lp%dhGhS}qC%5nkh4ZyaIUL>^8KX*o}pDk_@0B@n-_^*=`Q?Xt^))7 zSHvZMEiJx!A42Q55YxaHWa+LR*j&;><}2wz{;cCL_kAn4C_iKS_yutJXa(FTd`1d) z>!bcQDN45IfK|l=k*U}i#5q1ZcjHxXdE94eVf-4>{@o-h-%~_x`kPr%Ko8p^v7Uc> zm?`e68DLv9|FYHN-m@!thiT>h+w_=cHZ^3=ga3KYi&qlBx`_id{`HOnBg9B{DqeyzZMiuY&_Y4`m0myDg=2#e=x0S}P2icbUD2J5RIz_OZOhQ-l+B?dXlLwRG3v zJ~rj>EoO6I7d>3HiK|&Gh1}97toVTqoARWYdpC1BmD$iuzb|Uz#{Tdk;!ZbEBfc~m3B$v&H1bU+v^vRz`w6243 z7U>~y<=AnWDV0WYu4!|@hW50gY&uxg?O{2(Vlcg5NHSvdxZP{^gT&_%v~^ewsnKm8 zic=+~^d^=CUT&fMho&$XK8~&N5|HFZS<#dVcl3W1$+9d8xGCQRLpO2vf0 z^U7UA2FTH(c{#ZdH-8kYT;@Q9yVap1`3LjOy+UtVo**AB4zPz)+?kZcH4?w%Ik`W7 z8w?sNK}Lry@##|rn?ZRJwsHrRlUE0WO^rZ9X0takN$^^;n|6HmRbrilCtBk2@o^o-$JT_l13N@n+ z2@Aq+@b~4MB8x5vnW|zrSr{`BFHZZ)Do=&rj*&CD_{xd2DAW=Y7Dq5Mkim)b1Mp9d zF`94R$@YbuAhV@M3b!XMMR(;3Ok{eC-gFpX$y>|GBx?=sTAwy;4(ec?noHTJJfK^p zGWcGjIvKGUgCU`kSh0TsUeFvxeNU)iS&a?m1S_F1*cJT^E|A)GX}(X(F+y{nG5u95 z=;KyhZsnX-w%dfF{Gy4dpoGNo-(Rj>eG~SrDCJ~E+t9qo;na6wD{I-L%iZd)duCqCbutyOlZn9pLW&@uBfA zKGOx0syX4O2jpstxafJ35zb@Yyn<`jIll#Zb^CUe!j_dMsDkP!*k5~;Q{gFy)W>AO z{vYRPz2qeNJoY>_c+$yM{hL6;Gk+6v2{9=7o52MweoRh97}A)nQ^2>l81~G5L|Rq9 z(6sYbL|)aBE;Z<+*CXb`{%>6pcoCdVQBFjlN?B;u;0eSZYBl9*m$|p^wOY^99uS zql{aAs^KjsBoF(F!7?HhFmg9INxmaNW4uHb6`e3Eu@FjMmCzphBd{uXC8lcFg8UqD z+VOrgRva{=J}ut~8D>E(YR`l2<5v1V7<xknC<4pR2hQN~os_ugJ=x^F2^DJpo=(!9SH+4plu#F@2(eA=!)$@mRF0=NjpOg%%Af0+ z&gx0UaGqhA{0jRml+WZX(qH-s8=rBP)QB+T{`?(e;W2M+b4)gyerPAvcglpDzr&9W z`7Xk}JF}Y`@i69|O_Z?pK0;K8!V`GU+MY|i+{eRL{4`plTr+ zV8F7Gq3LvW@m$)(UJ5Rb{>Mi2Eh2$M4gE^0jjQ>f#gZNoq>{4&J^$czT3&P$&8vA$ zq8zJcXOzWO-WX+5+%OfB_Lo)Orq8)27<20-l{utY^3S#=|TODP>?U9)?j zVW$dr+g_Yf+J2wSn`zHq8263c+QzctvmtGeQ{y{Nmu%AU67?iYr0A}hW? zvp4gpHVJ{*BPfZo$ns+4`~0Yoa53(gv@9Dt*P6?37U!1l*~+!t4raY{j!^N$0uFnY zva`1Zf&O)9F?w??Xa)Zg#m`JWnQG}GA z-OW1BC}FK;xl`p18Pv8J@|^jlSgtrRgv%7v^Y-SipmcrBIB+(EllNEV0>=+?Zzl5i z?Vh=O??G99h*~e}>oQC>d_PTEc|K)P!b$E|?q)7A-GL(IPm_NpW4Sr;MwI`n98z`9 zVrpZW5I1Lv0xMfA5TNtNSWCi>yI9I&mrt>y{MH(ArU~`z$az`rv~DtYTWt%M$r*v< z_oH~DrZu&j+t0}veP&13?538l`NQTEeuSs16}i4yxqPXYqwJ~24Xl%i16Al7LH7Mn z=B(eRaLw!xzxQ`NJ5iNN&AQma`p14^gO5pbF2UNI_}vaF`;Ig1;Z9ILwDQB~cGk%$B3s86%${gPbRmOl2& zlK^VJ)@RnwR-Cjuu#-|bT1p-K_=t5W3}^c#oT#vNY3h*nFq>#6!@bD&q`FgEsK#C= z>X2nMb$$O=>gms5^5p=o|0 z8ZV<~uA)fg#aa9jo*CVGp_SZbuSlhopXBzPUC;J>7UcNk5vp8Pn%>vx%#NmBCD+*g z;p}D@b0&j2torDDDD*g$Y__~k3%dSPqud<&k6|Et zUXqwVe|vAq%H6A`A2h~O33DuQ`iHqJp8AEHle?YH+#bXg{5?d?vDPN_ra6%w)yHY^ ztafUL*GuyKDbZ&B{v*_%74xZ>7AZ`Mo=3*Bs;R8I_N+UQr@y?eVt>`2qjX|(VO@m~ zdn)od)t=%@y=YoPwJ}{` zwTzk{`GG&WDu(slI+NNN#G}KS0Bg76J#RPb%dh&pf=xOG+4K%SDr#Vi{MUA#Qrwl! z7t1`&53Tj1P;Cldc3~Oy@~0)8=U+js%Kyl>QQXdAfmq7q@^*^+cY`k%CPL4toq(yr)acMi^? zgwpo1XAFl~P}{%{^UUFjZ(gDf&9bB8pWUaDD*m$Y#bSCgv!C=#*5N>YEa%cw#Hyr9_Of%dpg|MN^{ol0H6;#`_qf$=2Ej>o}j+$I6}wT z=aS8pI$YOQV?l38+P441YO41h1PE`5KRH|C9kW@cuL~oD1OnP4zruBa}(N5!tZeDhSoVaDd zo-)^^=YCDVx-XuQfQ#Uisda2djtF&3*nk`il%vy44^v&s=1_O-*%*}f9jWXR{!cWPHrjE9KKyN0q*uZz~n71sI zdUrC6?rUF7Reg=7S}$Cnm@WhQQRO*$WLFlY=_*5)R+Lf;W+qa~Q?n@#>s;#M-$$sX z--s?zd_u8(anyI$GwjffQ&jp@XZrQmL`p_Ih5mEifU0ua$8LVNm*$+4_(g4*RE6pT z?&Odwn;BQhUuv98eTmnjWs((H^>756i)5P9`qyv^Tk}}QEK#=P@LY0559`Gt22y_J!=jMI0^jf}su%Tp=Z1P;6y} zFy;O506j1*ky|0DKxH-dlW7HIWKZrsnz|bLe%{PcCX+4g2-_*L2Rz>bKC9&ln8%|4dk*}w7c25+!ZP6E?-0nY=Y*aq!BU;Cv^(mz$77W2Z z{`D-i_8Xh)F32T!+pvq+r7UoX$ItK5u)$bNl`bv6SzfL!+cXcIq zu-cGa_b-jwdDxIs>p0Cezy8QJ_V{q;*Gq9ngFdoVSyQO+L?=71<~Y^r z@QM8{ER1(+N>Tbt6e)Gk#QtmwW!+RGsa%i!$n9MzztI(lOuFq=TB;;m?o*gE~j-v?~wz?Zc|4qNc!jdeD410RPwRd zC&BkGC1<}Er5>d^QH%Nyke_x-P#xEo(8*)gwC9;Cq_|uV>EV8vx?^>a{(a&Cd2M?i zRg`?4%!;+9Ou;Pb_y-ey{?gl2lBqKFHg*r?-z+N-!Aj6^6K~05PlEQr%2kfW%5&jGRYt$$2MRde;dv-)nquJl2(cH8? zocrj;u@7gtu_nCDn(EdNaHB=WcFdITWyd%bHASL7VIeszjjeuGu~pSw?TFY^1$Luh9200;xHh zcQxz2siD0tcG9hZC#k1@?$YxF!rsB21N1K|XBc*7C3jOHlM0>omo&H2r)~0ma-}V_a4(px&!KV?7?KagE<* zaY$i4r|SC_hOc&^f@V|XZsTVxFSCMbx|l^OX~(e_j`y)G0#nP;=~LP74=mUW>n)sm zU@=+dmP{3_@uZf#zsV*JdGp6cjkpxcN9=yf&0LaFA75ush%#?k#P#EJcEzW!Z1`Vq zuCVPEyEyDMtDf3Uei+N(@4aisb&T|~F)RDXQLFpxqjlkYuX$puY1?O#c+<+p2IjD6 zT$U0|n?nih=wpNQ?YXKyf$YAV`E0hsMXGzs5VijFFaE?+FH&ZgP;+6!eD2NsGJflq zE`EKVC-^d@p6-o#LS?6#&|8lSj7wV;nhzbXrIjr{QsFn=lQKr%s5+HCR&`4_<^5WW zw9r~crC)f<|F-D@siq)DRZ}LkpWY!lvU`NwAR+}yI@QGk-0~WIfl_`$HLgb zcTKcnz(wl7jw&)ea|ye2@Bw)#VH2$?&;%JMoTUo72+}5^4qi4nM`z`5)T+z5q|T5? zb8MRfwRg@qX=;&3Z`xNzPac7kLiHIeB^}Zn5x{Ye27|fNqqkVefh=-Ys46WLQA?ky zxk5WurBICvf}7_oIYxIb>7-A|9j6?xx6$TXk8z__N9m=`w%D23#>tAOQRWFUq^Bezz&(>t^{inp$o_J8C`KHj>fIkixP4YrwNx05vPIxjF; zPfp_`ET?ccZSS%*M_y5_(>Y47vXZK)Ze|Zj7E_Mk62CXWmU}6CoSmfsSmo;v_-;@4 zu=O?PxNRS0*#|WTsV3P1veo-N>z#FxnzvViD@y#x#tY87s(Ylk^ks{w#oY!RjuptY zv%j*R-md2y({j07?~CjKp=Fdop&kF-ENL!F>NDH)y@A?n`kCD*bp@BD{vp>Li=}=a z?PX0m1)!zjqf|*u4p_5Wl*^Sl`9CFf|2eU6!T-OoFnSZg72p5E{<4>6>vam*c~?4F z>FHXW&-*s2$m*-5yeH1P<^v^^UKY3 zxe1|v{Emaq*rP-(U-$JG8!+!TIXL|bJ1+NzjaHq>H6AVGmkKLUL7{?f)|qSUEEh#i zvvCG@GenWQ{%@Qbn=8W&XbI7H-!Jx@!w{?BO>nZ+lH3i`D!BBkJ6nPe_!}9~IZivHAWyLKCGW-CG) z^^UXQK|+i5Ev~aYk_pXgV*1$7AEC5w?_qj*-;d@!0uYh&pI^2;`cLS-AYXdFc#f@# zLRWK$0E#DceZV&7bd+sqz+$@L`?lsNk4u!k^)*`|PMa3JQPF&H+kUz~eh1BlxZD2B zma!f50`!xGR?Qzi{iWa@Ic`M#5dHamI{iOpLGAyfSN^YA_&9<6a6Nn1b08TfRVG@%j&L=KoHNH2=RDxc@gX@_&MC6^{N7H0@#Y zLQ;HU5ud*Q5`V2U%ql~>Uxz~?eTd)ep36bQn3qx4w##t1(%8`s5c#Vbr+=PKE%t+4r1SXzb z+A_K=JO8}llm2KKCbkeo25qCNm@eR_7_%BM@;J-6xNV@ho(HWKvYQB}iD*Gf9Su}$$l%NSq-RI(} zeZ!zMX9wo$2k^;ryKzRcDt{v(O};Bg;;U$OVlulM&3xj-nJAcGggYLTs)5@c)iFichVBE^l*ljeu+P+SZ4-KdT-2^J~Nw?Kg%O;1s;K;)@SkQ=PD#OG!-6{yiDG> z>&gGK&YnNB?E)NkKf>RuT)|H*H|Mu^i1HhgNVxVvAPM?8;)kIo6rZSo2a@jKbsMxv z=j735b*bvE2^?byySGa~xPYl4_c8PetUJW)E-T-|A z!}--k$ASMVb#lkr0=~(@BD8$NSLi}RvZpJJ^i&m443CTPe=j*l`tFP8zYtIz6=Ds@ zn%-FQ?YS8KwKYZjj~6lQ$m#@#7rB6hUQ52ZSP=PtEph*Qi2Xmq`#(t0|FOia%Mt>+ zvvP@@8fO^+oRUyFI3HBHF9oE>XGU^UCX<*k(Bz_)1}+qeHJyCBu4$XE5)<(^iO?cq zkn)ivCOF#?_0^{Gwp`nToOYOk{1yiwd$FImcm5pVD12Bjz6;gPZ)A>EJAw=Mt-&kl z^~fk7iDBn!@P=~k@v5R4cr!Y^fb{HmX6V`yWG(R94PE)naNcVPwF{?tUphjYs+T1o zQ_DC;Y1$bOKJ`V@xuRD@$AKE+P=9Ze`dja&&5nJ%|6-x}@1kk-@)qEi) zSH=SK_8qwK=W5>KA8p`Uei+zoDG7SE&4usA)u7h;<$#`KW47 z1o%;wgzoNr4Wxv-(cX2|Fw$KU+vQln1F27#3F9kJC$|n2Ijh4Nss`}x)&)5GoIOgn z{(_EW3?Q+d+$Q(XV&3aBUqPQm1aJ@+Cf25P1LMWI=;za;=+~|DXo^K0nx4di!e*Os z^|ME4Nct0TuInbiT9R<~tVgJ6{0%U>W`>VF-GG;CMxwP#-XS?R1^lk|JPP0A49~Jn zO(yG-7~ZfwG_2J_PF*5U!NvnHNn=f)Ut2<^EtGklr~#K8n~Nf^Ie|+*CeS}<1$7@6 zFthC6qd8CPaLwdY)H*yHynUVqwj8)Z%(h^G-{Ko!?YYZDqiH+}RGv$e{y7WMnXOpi z!&Yz^?Lxl~O%O*~En(C*Wh?@vk^1G2yn|KwjQYdb$iU43bZj9}#qNA2p`{I+?0*jq zt#(16B%F9LIE|?e$Y9*LLa;L`1#Gds0mylQIPtJKuGn3IYt7nFkC!*0ueAwpm0b)~ zR~a{wpVZ;YqA09k?18KQ_JR7OC~SY{4r&gJhX);$pr8|v#}+pt{@HuPGcE&|I*UO$ zldnvYq#{r%N`j9~o6zX44Tv;t;;q#x0F6}=a5z5~=m`HtexK)nl%sdhhpqC&_LYaw zAsr{8yF>w*_sqn>6+!T6>qel{v=>DC31jtJUieXm8Cv~F4#mC|g6v}>*g7&D>J{H1 ze%hL%E_njWCmG0!G+U^C5G;b0InM|Z;Hx;_=^885z2;ATJ%5OmalgX%r=Z*^F8YgKAbOLh~KMu(gCjpUxt!2vn>_~GqGa*0@nJ@95^2Z}nXjaz$tz%7X( zCVTxVBrK+lMXs6do6wq<=opxjO|O__P{MzrPViof-t-VE}&c zClTvK{6yC8RZ&9D1>WU>2q2}{#~54b!GD*+(dr@x^x^h8oY8WTNzQ9ygx9e^Ar1kt z`o&OU*)_CJVT9OF7zTEH3Ps17l5u*AD6EX+Kuwn#hF24Sh-WpiMJ|t6>DdM<4aOP9 z?jBg%o=%kgqEMP_Er`unhIC&hpmj!@!qYfol`8a?WI5~jK zKD`6{GkwhA0$u#*ZX#T#(?hI1J%pT=S-{V(XRyOYTP*H61WqbfW>F$ zqOlfv3|1hJwL2QOZ#l)J6*Yn29(U|&^NIKu{D8Pp<_tWCpP}?af0-*1pMl%3C=s6H zh(eqtQ1E6A(B-!p=ZtiqnVTYz_}xo{Ve3Muy7N8Qw&W=iPZ?=Lj%g| zzQw$mwF`Xdn@_BWJqe^gkjBGEn= z{U8=RkCDfQXUf2OA#wbBIRS{QQ)u9CFF2t(iHfg`qNZySct!R;rnt+GkSNbZ@rHu` zZYM#^N^S+lky2P~fPi~zYluq>1O}<+fM4WOrt^CSZiY18l=l;*=r$0aZmz?!pWNW5 zBexivm>J;ZvUrqaKp)!cy;KlrWFi<_&dG$XH|o%8T?RNyS)zx!dvRQ? zA3pVY6?1gkH!u)&4&e7&QQLhx;%F#`e8~);wbul5RRK>MM4<2f z2T-zl8k!z$gxiOt@%R{@8R~a|Or97s@u7`5C~S`}f5hO}Hg|MxN;L|ww?W*7Ot8+U z5zYS|4^7T{0loYPkRK@vR=E4)Cfj%D+3I0*C9Q|h@16@K#Xka>ThCGJCj`2CPJ{gvMC&GOp$>7 z;{dIUTL?mx{Ly|9K4H$6#kEHxP{8}^;LUsmIJjaJ@Fs+t+6u~;e#b%J-tZJ0X&gjT z-@QSvP4}Tkl_$}uITGNT#%5qz!N(yp20>PbzdWJF*45 zNZgLvU#^8AN=~>Wy8~rO&V=`UCD7|8Vd%2t+_%j3b2$cM~|O-rz(upQRgFb~aW+sw?c>SFHeH8Wv1!kC+y znRquy3cu5ed}Su@M=^ ziQ>bN9y~Y8&qPDcEygET2CuvMmx*6c0QW|iL8ZOZ@Smf@z+##-TH<$$w_`&hI@9

    ~$$DBN6chL7B4(aztU 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 Qv+{RO_5Zk=0RiLwKg%|Hga7~l diff --git a/examples/pipe/output_pipe/checkpoints/latest.pdstates b/examples/pipe/output_pipe/checkpoints/latest.pdstates deleted file mode 100644 index 01dd31eb49cc576ae794b43e80f88132b8ff8eae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45 scmZo*nX1G90ku;!df0MPONug+r?}UDfC%=mrWWKUXH4 Date: Fri, 5 May 2023 09:30:21 +0000 Subject: [PATCH 07/31] add main --- examples/aneurysm/aneurysm_flow_FCNN.py | 683 +++++++++++------------- 1 file changed, 320 insertions(+), 363 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow_FCNN.py b/examples/aneurysm/aneurysm_flow_FCNN.py index c75fe7ac3..170997d60 100644 --- a/examples/aneurysm/aneurysm_flow_FCNN.py +++ b/examples/aneurysm/aneurysm_flow_FCNN.py @@ -115,377 +115,334 @@ def momentum_z_compute_func(out): self.add_equation("momentum_z", momentum_z_compute_func) -os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") -output_dir = "./output_0504_debug" -ppsci.utils.misc.set_random_seed(42) - -# initialize logger -ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") -core.set_prim_eager_enabled(True) - -EPOCHS = 500 -L = 1 -X_IN = 0 -X_OUT = X_IN + L -P_OUT = 0 # pressure at the outlet of pipe -P_IN = 0.1 # pressure at the inlet of pipe -rInlet = 0.05 -nPt = 100 -unique_x = np.linspace(X_IN, X_OUT, nPt) -mu = 0.5 * (X_OUT - X_IN) -N_y = 20 -x_2d = np.tile(unique_x, N_y) -x_2d = np.reshape(x_2d, (len(x_2d), 1)) -nu = 1e-3 -sigma = 0.1 -scaleStart = -0.02 -scaleEnd = 0 -Ng = 50 -scale_1d = np.linspace(scaleStart, scaleEnd, Ng, endpoint=True) -x, scale = ThreeD_mesh(x_2d, scale_1d) - -# axisymetric boundary -R = ( - scale - * 1 - / math.sqrt(2 * np.pi * sigma**2) - * np.exp(-((x - mu) ** 2) / (2 * sigma**2)) -) - -# Generate stenosis -yUp = (rInlet - R) * np.ones_like(x) -yDown = (-rInlet + R) * np.ones_like(x) -idx = np.where(scale == scaleStart) -plt.figure() -plt.scatter(x[idx], yUp[idx]) -plt.scatter(x[idx], yDown[idx]) -plt.axis("equal") -plt.show() -plt.savefig("idealized_stenotid_vessel", bbox_inches="tight") - -y = np.zeros([len(x), 1]) -for x0 in unique_x: - index = np.where(x[:, 0] == x0)[0] - Rsec = max(yUp[index]) - tmpy = np.linspace(-Rsec, Rsec, len(index)).reshape(len(index), -1) - y[index] = tmpy - - -RHO = 1 -BATCH_SIZE = 50 -LEARNING_RATE = 1e-3 -LAYER_NUMBER = 4 - 1 -HIDDEN_SIZE = 20 - -index = [i for i in range(x.shape[0])] -res = list(zip(x, y, scale)) -np.random.shuffle(res) -x, y, scale = zip(*res) -x = np.array(x).astype(float) -y = np.array(y).astype(float) -scale = np.array(scale).astype(float) - -interior_geom = ppsci.geometry.PointCloud( - coord_dict={"x": x, "y": y}, - extra_data={"scale": scale}, - data_key=["x", "y", "scale"], -) - -model_2 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["u"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - np.load(f"data/net2_params/weight_epoch_0.npz"), - np.load(f"data/net2_params/bias_epoch_0.npz"), -) - -model_3 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["v"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - np.load(f"data/net3_params/weight_epoch_0.npz"), - np.load(f"data/net3_params/bias_epoch_0.npz"), -) - -model_4 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["p"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - np.load(f"data/net4_params/weight_epoch_0.npz"), - np.load(f"data/net4_params/bias_epoch_0.npz"), -) - - -class Output_transform: - def __init__(self) -> None: - pass - - def __call__(self, out, input): - new_out = {} - x, y, scale = input["x"], input["y"], input["scale"] - # axisymetric boundary - if next(iter(out.keys())) == "u": - R = ( - scale - * 1 - / np.sqrt(2 * np.pi * sigma**2) - * paddle.exp(-((x - mu) ** 2) / (2 * sigma**2)) - ) - self.h = rInlet - R - u = out["u"] - # The no-slip condition of velocity on the wall - new_out["u"] = u * (self.h**2 - y**2) - elif next(iter(out.keys())) == "v": - v = out["v"] - # The no-slip condition of velocity on the wall - new_out["v"] = (self.h**2 - y**2) * v - elif next(iter(out.keys())) == "p": - p = out["p"] - # The pressure inlet [p_in = 0.1] and outlet [p_out = 0] - new_out["p"] = ( - (X_IN - x) * 0 - + (P_IN - P_OUT) * (X_OUT - x) / L - + 0 * y - + (X_IN - x) * (X_OUT - x) * p - ) - else: - raise NotImplementedError(f"{out.keys()} are outputs to be implemented") - - return new_out - - -shared_transform = Output_transform() -model_2.register_output_transform(shared_transform) -model_3.register_output_transform(shared_transform) -model_4.register_output_transform(shared_transform) -model = ppsci.arch.ModelList([model_2, model_3, model_4]) - -optimizer2 = ppsci.optimizer.Adam( - LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 -)([model]) - -equation = {"NavierStokes": NavierStokes(RHO, 2, False)} - -pde_constraint = ppsci.constraint.InteriorConstraint( - equation["NavierStokes"].equations, - {"continuity": 0, "momentum_x": 0, "momentum_y": 0}, - geom=interior_geom, - dataloader_cfg={ - "dataset": "NamedArrayDataset", - "num_workers": 1, - "batch_size": BATCH_SIZE, - "iters_per_epoch": int(x.shape[0] / BATCH_SIZE), - "sampler": { - "name": "BatchSampler", - "shuffle": False, - "drop_last": False, - }, - }, - loss=ppsci.loss.MSELoss("mean"), - evenly=True, - weight_dict={"u": 1, "v": 1, "p": 1}, - name="EQ", -) - -# initialize solver -solver = ppsci.solver.Solver( - model, - {pde_constraint.name: pde_constraint}, - output_dir, - optimizer2, - epochs=EPOCHS, - iters_per_epoch=int(x.shape[0] / BATCH_SIZE), - eval_during_train=False, - save_freq=10, - log_freq=1, - equation=equation, - checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504/checkpoints/epoch_280", -) - -# solver.train() -def predict( - input_dict, - solver, -): - for key, val in input_dict.items(): - input_dict[key] = paddle.to_tensor(val, dtype="float32") - evaluator = ppsci.utils.expression.ExpressionSolver( - input_dict.keys(), ["u", "v", "p"], solver.model - ) - output_expr_dict = { - "u": lambda d: d["u"], - "v": lambda d: d["v"], - "p": lambda d: d["p"], - } - for output_key, output_expr in output_expr_dict.items(): - evaluator.add_target_expr(output_expr, output_key) - output_dict = evaluator(input_dict) - return output_dict - - -def single_test(x, y, scale, caseIdx): - xt = paddle.to_tensor(x, dtype="float32") - yt = paddle.to_tensor(y, dtype="float32") - scalet = scale * paddle.ones_like(xt) - net_in = {"x": xt, "y": yt, "scale": scalet} - output_dict = predict(net_in, solver) - np.savez( - "./" + str(int(caseIdx)) + "ML_WallStress_uvp", - x_center=x, - y_center=y, - u_center=output_dict["u"], - v_center=output_dict["v"], - p_center=output_dict["p"], +if __name__ == "__main__": + os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") + output_dir = "./output_0504_debug" + ppsci.utils.misc.set_random_seed(42) + + # initialize logger + ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") + core.set_prim_eager_enabled(True) + + EPOCHS = 500 + L = 1 + X_IN = 0 + X_OUT = X_IN + L + P_OUT = 0 # pressure at the outlet of pipe + P_IN = 0.1 # pressure at the inlet of pipe + rInlet = 0.05 + nPt = 100 + unique_x = np.linspace(X_IN, X_OUT, nPt) + mu = 0.5 * (X_OUT - X_IN) + N_y = 20 + x_2d = np.tile(unique_x, N_y) + x_2d = np.reshape(x_2d, (len(x_2d), 1)) + nu = 1e-3 + sigma = 0.1 + scaleStart = -0.02 + scaleEnd = 0 + Ng = 50 + scale_1d = np.linspace(scaleStart, scaleEnd, Ng, endpoint=True) + x, scale = ThreeD_mesh(x_2d, scale_1d) + + # axisymetric boundary + R = ( + scale + * 1 + / math.sqrt(2 * np.pi * sigma**2) + * np.exp(-((x - mu) ** 2) / (2 * sigma**2)) ) - return output_dict - - -scale_test = np.load("aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")["scale"] -os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") -caseCount = [1.0, 151.0, 486.0] -W_ctl = np.zeros([len(scale_test), 1]) -W_ctl_Ml = np.zeros([len(scale_test), 1]) -plot_x = 0.8 -plot_y = 0.06 -fontsize = 14 -axis_limit = [0, 1, -0.15, 0.15] -path = "./data/cases/" -for caseIdx in caseCount: - scale = scale_test[int(caseIdx - 1)] - Data_CFD = np.load(path + str(caseIdx) + "CFD_contour.npz") - Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") - x = Data_CFD["x"] - y = Data_CFD["y"] - U_CFD = Data_CFD["U"] - U = Data_NN["U"] - n = len(x) - output_dict = single_test( - x.reshape(n, 1), y.reshape(n, 1), np.ones((n, 1)) * scale, caseIdx - ) - u, v, p = output_dict["u"], output_dict["v"], output_dict["p"] - w = np.zeros_like(u) - U = np.concatenate([u, v, w], axis=1) - # velocity U + # Generate stenosis + yUp = (rInlet - R) * np.ones_like(x) + yDown = (-rInlet + R) * np.ones_like(x) + idx = np.where(scale == scaleStart) plt.figure() - plt.subplot(212) - plt.scatter(x, y, c=U[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) - plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.colorbar() - plt.subplot(211) - plt.scatter(x, y, c=U_CFD[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) - plt.colorbar() - plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.savefig( - "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_uContour_test.png", - bbox_inches="tight", + plt.scatter(x[idx], yUp[idx]) + plt.scatter(x[idx], yDown[idx]) + plt.axis("equal") + plt.show() + plt.savefig("idealized_stenotid_vessel", bbox_inches="tight") + + y = np.zeros([len(x), 1]) + for x0 in unique_x: + index = np.where(x[:, 0] == x0)[0] + Rsec = max(yUp[index]) + tmpy = np.linspace(-Rsec, Rsec, len(index)).reshape(len(index), -1) + y[index] = tmpy + + RHO = 1 + BATCH_SIZE = 50 + LEARNING_RATE = 1e-3 + LAYER_NUMBER = 4 - 1 + HIDDEN_SIZE = 20 + + index = [i for i in range(x.shape[0])] + res = list(zip(x, y, scale)) + np.random.shuffle(res) + x, y, scale = zip(*res) + x = np.array(x).astype(float) + y = np.array(y).astype(float) + scale = np.array(scale).astype(float) + + interior_geom = ppsci.geometry.PointCloud( + coord_dict={"x": x, "y": y}, + extra_data={"scale": scale}, + data_key=["x", "y", "scale"], ) - # velocity V - plt.figure() - plt.subplot(212) - plt.scatter(x, y, c=U[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) - plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.colorbar() - plt.subplot(211) - plt.scatter(x, y, c=U_CFD[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) - plt.colorbar() - plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.savefig( - "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_vContour_test.png", - bbox_inches="tight", + model_2 = ppsci.arch.MLP( + ["x", "y", "scale"], + ["u"], + LAYER_NUMBER, + HIDDEN_SIZE, + "swish", + False, + False, + np.load(f"data/net2_params/weight_epoch_0.npz"), + np.load(f"data/net2_params/bias_epoch_0.npz"), ) - plt.close("all") - # wall shear stress - Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") - unique_x = Data_CFD_wss["x"] - wall_shear_mag_up = Data_CFD_wss["wss"] - Data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") - NNwall_shear_mag_up = Data_NN_wss["wss"] + model_3 = ppsci.arch.MLP( + ["x", "y", "scale"], + ["v"], + LAYER_NUMBER, + HIDDEN_SIZE, + "swish", + False, + False, + np.load(f"data/net3_params/weight_epoch_0.npz"), + np.load(f"data/net3_params/bias_epoch_0.npz"), + ) - plt.figure() - plt.plot( - unique_x, - wall_shear_mag_up, - label="CFD", - color="darkblue", - linestyle="-", - lw=3.0, - alpha=1.0, + model_4 = ppsci.arch.MLP( + ["x", "y", "scale"], + ["p"], + LAYER_NUMBER, + HIDDEN_SIZE, + "swish", + False, + False, + np.load(f"data/net4_params/weight_epoch_0.npz"), + np.load(f"data/net4_params/bias_epoch_0.npz"), ) - plt.plot( - unique_x, - NNwall_shear_mag_up, - label="DNN", - color="red", - linestyle="--", - dashes=(5, 5), - lw=2.0, - alpha=1.0, + + class Output_transform: + def __init__(self) -> None: + pass + + def __call__(self, out, input): + new_out = {} + x, y, scale = input["x"], input["y"], input["scale"] + # axisymetric boundary + if next(iter(out.keys())) == "u": + R = ( + scale + * 1 + / np.sqrt(2 * np.pi * sigma**2) + * paddle.exp(-((x - mu) ** 2) / (2 * sigma**2)) + ) + self.h = rInlet - R + u = out["u"] + # The no-slip condition of velocity on the wall + new_out["u"] = u * (self.h**2 - y**2) + elif next(iter(out.keys())) == "v": + v = out["v"] + # The no-slip condition of velocity on the wall + new_out["v"] = (self.h**2 - y**2) * v + elif next(iter(out.keys())) == "p": + p = out["p"] + # The pressure inlet [p_in = 0.1] and outlet [p_out = 0] + new_out["p"] = ( + (X_IN - x) * 0 + + (P_IN - P_OUT) * (X_OUT - x) / L + + 0 * y + + (X_IN - x) * (X_OUT - x) * p + ) + else: + raise NotImplementedError(f"{out.keys()} are outputs to be implemented") + + return new_out + + shared_transform = Output_transform() + model_2.register_output_transform(shared_transform) + model_3.register_output_transform(shared_transform) + model_4.register_output_transform(shared_transform) + model = ppsci.arch.ModelList([model_2, model_3, model_4]) + + optimizer2 = ppsci.optimizer.Adam( + LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 + )([model]) + + equation = {"NavierStokes": NavierStokes(RHO, 2, False)} + + pde_constraint = ppsci.constraint.InteriorConstraint( + equation["NavierStokes"].equations, + {"continuity": 0, "momentum_x": 0, "momentum_y": 0}, + geom=interior_geom, + dataloader_cfg={ + "dataset": "NamedArrayDataset", + "num_workers": 1, + "batch_size": BATCH_SIZE, + "iters_per_epoch": int(x.shape[0] / BATCH_SIZE), + "sampler": { + "name": "BatchSampler", + "shuffle": False, + "drop_last": False, + }, + }, + loss=ppsci.loss.MSELoss("mean"), + evenly=True, + weight_dict={"u": 1, "v": 1, "p": 1}, + name="EQ", ) - plt.xlabel(r"x", fontsize=16) - plt.ylabel(r"$\tau_{c}$", fontsize=16) - plt.legend(prop={"size": 16}) - plt.savefig( - "plot/" + str(int(caseIdx)) + "_nu_" + str(nu) + "_wallshear_test.png", - bbox_inches="tight", + + # initialize solver + solver = ppsci.solver.Solver( + model, + {pde_constraint.name: pde_constraint}, + output_dir, + optimizer2, + epochs=EPOCHS, + iters_per_epoch=int(x.shape[0] / BATCH_SIZE), + eval_during_train=False, + save_freq=10, + log_freq=1, + equation=equation, + checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504/checkpoints/epoch_280", ) - plt.close("all") - - # x_centerline = np.linspace(X_IN, X_OUT, 100, endpoint=True).reshape(100, 1) - # y_centerline = np.zeros((100, 1)) - # output_dict_centerline = single_test( - # x_centerline, y_centerline, np.ones((100, 1)) * scale, caseIdx - # ) - # y_cfd = Data_CFD["y"] - # index = np.where(abs(y_cfd) < 0.001002) - # x_cfd = Data_CFD["x"][index] - # p_cfd = Data_CFD["P"][index] - # index = np.argsort(x_cfd) - # x_cfd = x_cfd[index] - # y_cfd = y_cfd[index] - # p_cfd = p_cfd[index] - # plt.figure() - # plt.plot( - # x_cfd, - # p_cfd, - # label="CFD", - # color="darkblue", - # linestyle="-", - # lw=3.0, - # alpha=1.0, - # ) - # plt.plot( - # x_centerline, - # output_dict_centerline['p'], - # label="DNN", - # color="red", - # linestyle="--", - # lw=3.0, - # alpha=1.0, - # ) - # plt.xlabel(r"x", fontsize=16) - # plt.ylabel(r"$p_{c}$", fontsize=16) - # plt.legend(prop={"size": 16}) - # plt.savefig( - # "plot/" + str(int(caseIdx)) + "_nu_" + str(nu) + "_center_pressure.png", - # bbox_inches="tight", - # ) - # plt.close("all") + + # solver.train() + def predict( + input_dict, + solver, + ): + for key, val in input_dict.items(): + input_dict[key] = paddle.to_tensor(val, dtype="float32") + evaluator = ppsci.utils.expression.ExpressionSolver( + input_dict.keys(), ["u", "v", "p"], solver.model + ) + output_expr_dict = { + "u": lambda d: d["u"], + "v": lambda d: d["v"], + "p": lambda d: d["p"], + } + for output_key, output_expr in output_expr_dict.items(): + evaluator.add_target_expr(output_expr, output_key) + output_dict = evaluator(input_dict) + return output_dict + + def single_test(x, y, scale, caseIdx): + xt = paddle.to_tensor(x, dtype="float32") + yt = paddle.to_tensor(y, dtype="float32") + scalet = scale * paddle.ones_like(xt) + net_in = {"x": xt, "y": yt, "scale": scalet} + output_dict = predict(net_in, solver) + np.savez( + "./" + str(int(caseIdx)) + "ML_WallStress_uvp", + x_center=x, + y_center=y, + u_center=output_dict["u"], + v_center=output_dict["v"], + p_center=output_dict["p"], + ) + return output_dict + + scale_test = np.load("aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ + "scale" + ] + os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") + caseCount = [1.0, 151.0, 486.0] + W_ctl = np.zeros([len(scale_test), 1]) + W_ctl_Ml = np.zeros([len(scale_test), 1]) + plot_x = 0.8 + plot_y = 0.06 + fontsize = 14 + axis_limit = [0, 1, -0.15, 0.15] + path = "./data/cases/" + for caseIdx in caseCount: + scale = scale_test[int(caseIdx - 1)] + Data_CFD = np.load(path + str(caseIdx) + "CFD_contour.npz") + Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") + x = Data_CFD["x"] + y = Data_CFD["y"] + U_CFD = Data_CFD["U"] + U = Data_NN["U"] + n = len(x) + output_dict = single_test( + x.reshape(n, 1), y.reshape(n, 1), np.ones((n, 1)) * scale, caseIdx + ) + u, v, p = output_dict["u"], output_dict["v"], output_dict["p"] + w = np.zeros_like(u) + U = np.concatenate([u, v, w], axis=1) + + # velocity U + plt.figure() + plt.subplot(212) + plt.scatter(x, y, c=U[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.colorbar() + plt.subplot(211) + plt.scatter(x, y, c=U_CFD[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.colorbar() + plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.savefig( + "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_uContour_test.png", + bbox_inches="tight", + ) + + # velocity V + plt.figure() + plt.subplot(212) + plt.scatter(x, y, c=U[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.colorbar() + plt.subplot(211) + plt.scatter(x, y, c=U_CFD[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.colorbar() + plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.axis(axis_limit) + plt.savefig( + "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_vContour_test.png", + bbox_inches="tight", + ) + plt.close("all") + + # wall shear stress + Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") + unique_x = Data_CFD_wss["x"] + wall_shear_mag_up = Data_CFD_wss["wss"] + Data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") + NNwall_shear_mag_up = Data_NN_wss["wss"] + + plt.figure() + plt.plot( + unique_x, + wall_shear_mag_up, + label="CFD", + color="darkblue", + linestyle="-", + lw=3.0, + alpha=1.0, + ) + plt.plot( + unique_x, + NNwall_shear_mag_up, + label="DNN", + color="red", + linestyle="--", + dashes=(5, 5), + lw=2.0, + alpha=1.0, + ) + plt.xlabel(r"x", fontsize=16) + plt.ylabel(r"$\tau_{c}$", fontsize=16) + plt.legend(prop={"size": 16}) + plt.savefig( + "plot/" + str(int(caseIdx)) + "_nu_" + str(nu) + "_wallshear_test.png", + bbox_inches="tight", + ) + plt.close("all") From 200bde2a4623f9ec1282ee8b4d5cfb3411af5c91 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Tue, 16 May 2023 09:41:44 +0000 Subject: [PATCH 08/31] clean code --- examples/aneurysm/aneurysm_flow_FCNN.py | 152 +++++++++--------- ...cale0005to002_eval0to002mean001_3sigma.npz | Bin 4244 -> 0 bytes examples/aneurysm/plot_geoaneurysm.py | 141 ---------------- examples/aneurysm/single_test.py | 57 ------- 4 files changed, 76 insertions(+), 274 deletions(-) delete mode 100644 examples/aneurysm/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz delete mode 100644 examples/aneurysm/plot_geoaneurysm.py delete mode 100644 examples/aneurysm/single_test.py diff --git a/examples/aneurysm/aneurysm_flow_FCNN.py b/examples/aneurysm/aneurysm_flow_FCNN.py index 170997d60..86700fcaf 100644 --- a/examples/aneurysm/aneurysm_flow_FCNN.py +++ b/examples/aneurysm/aneurysm_flow_FCNN.py @@ -55,8 +55,8 @@ def momentum_x_compute_func(out): momentum_x = ( u * jacobian(u, x) + v * jacobian(u, y) - - nu / rho * hessian(u, x) - - nu / rho * hessian(u, y) + - NU / rho * hessian(u, x) + - NU / rho * hessian(u, y) + 1 / rho * jacobian(p, x) ) if self.time: @@ -66,7 +66,7 @@ def momentum_x_compute_func(out): z = out["z"] w = out["w"] momentum_x += w * jacobian(u, z) - momentum_x -= nu / rho * hessian(u, z) + momentum_x -= NU / rho * hessian(u, z) return momentum_x self.add_equation("momentum_x", momentum_x_compute_func) @@ -77,8 +77,8 @@ def momentum_y_compute_func(out): momentum_y = ( u * jacobian(v, x) + v * jacobian(v, y) - - nu / rho * hessian(v, x) - - nu / rho * hessian(v, y) + - NU / rho * hessian(v, x) + - NU / rho * hessian(v, y) + 1 / rho * jacobian(p, y) ) if self.time: @@ -88,7 +88,7 @@ def momentum_y_compute_func(out): z = out["z"] w = out["w"] momentum_y += w * jacobian(v, z) - momentum_y -= nu / rho * hessian(v, z) + momentum_y -= NU / rho * hessian(v, z) return momentum_y self.add_equation("momentum_y", momentum_y_compute_func) @@ -102,9 +102,9 @@ def momentum_z_compute_func(out): u * jacobian(w, x) + v * jacobian(w, y) + w * jacobian(w, z) - - nu / rho * hessian(w, x) - - nu / rho * hessian(w, y) - - nu / rho * hessian(w, z) + - NU / rho * hessian(w, x) + - NU / rho * hessian(w, y) + - NU / rho * hessian(w, z) + 1 / rho * jacobian(p, z) ) if self.time: @@ -115,68 +115,94 @@ def momentum_z_compute_func(out): self.add_equation("momentum_z", momentum_z_compute_func) +def predict( + input_dict, + solver, +): + for key, val in input_dict.items(): + input_dict[key] = paddle.to_tensor(val, dtype="float32") + evaluator = ppsci.utils.expression.ExpressionSolver( + input_dict.keys(), ["u", "v", "p"], solver.model + ) + output_expr_dict = { + "u": lambda d: d["u"], + "v": lambda d: d["v"], + "p": lambda d: d["p"], + } + for output_key, output_expr in output_expr_dict.items(): + evaluator.add_target_expr(output_expr, output_key) + output_dict = evaluator(input_dict) + return output_dict + + if __name__ == "__main__": os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") - output_dir = "./output_0504_debug" + # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) + # set output directory + output_dir = "./output_0504_debug" + # initialize logger ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") core.set_prim_eager_enabled(True) + # Hyper parameters EPOCHS = 500 + BATCH_SIZE = 50 + LEARNING_RATE = 1e-3 + LAYER_NUMBER = 4 - 1 + HIDDEN_SIZE = 20 + + # Physic properties + P_OUT = 0 # pressure at the outlet of pipe + P_IN = 0.1 # pressure at the inlet of pipe + NU = 1e-3 + RHO = 1 + + # Geometry L = 1 X_IN = 0 X_OUT = X_IN + L - P_OUT = 0 # pressure at the outlet of pipe - P_IN = 0.1 # pressure at the inlet of pipe - rInlet = 0.05 - nPt = 100 - unique_x = np.linspace(X_IN, X_OUT, nPt) + R_INLET = 0.05 + unique_x = np.linspace(X_IN, X_OUT, 100) mu = 0.5 * (X_OUT - X_IN) N_y = 20 x_2d = np.tile(unique_x, N_y) x_2d = np.reshape(x_2d, (len(x_2d), 1)) - nu = 1e-3 - sigma = 0.1 - scaleStart = -0.02 - scaleEnd = 0 - Ng = 50 - scale_1d = np.linspace(scaleStart, scaleEnd, Ng, endpoint=True) + SIGMA = 0.1 + SCALE_START = -0.02 + SCALE_END = 0 + scale_1d = np.linspace(SCALE_START, SCALE_END, 50, endpoint=True) x, scale = ThreeD_mesh(x_2d, scale_1d) - # axisymetric boundary + # Axisymetric boundary R = ( scale * 1 - / math.sqrt(2 * np.pi * sigma**2) - * np.exp(-((x - mu) ** 2) / (2 * sigma**2)) + / math.sqrt(2 * np.pi * SIGMA**2) + * np.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) ) # Generate stenosis - yUp = (rInlet - R) * np.ones_like(x) - yDown = (-rInlet + R) * np.ones_like(x) - idx = np.where(scale == scaleStart) + y_up = (R_INLET - R) * np.ones_like(x) + y_down = (-R_INLET + R) * np.ones_like(x) + idx = np.where(scale == SCALE_START) plt.figure() - plt.scatter(x[idx], yUp[idx]) - plt.scatter(x[idx], yDown[idx]) + plt.scatter(x[idx], y_up[idx]) + plt.scatter(x[idx], y_down[idx]) plt.axis("equal") plt.show() - plt.savefig("idealized_stenotid_vessel", bbox_inches="tight") + plt.savefig("./plot/idealized_stenotid_vessel", bbox_inches="tight") + # Points and shuffle(for alignment) y = np.zeros([len(x), 1]) for x0 in unique_x: index = np.where(x[:, 0] == x0)[0] - Rsec = max(yUp[index]) + Rsec = max(y_up[index]) tmpy = np.linspace(-Rsec, Rsec, len(index)).reshape(len(index), -1) y[index] = tmpy - RHO = 1 - BATCH_SIZE = 50 - LEARNING_RATE = 1e-3 - LAYER_NUMBER = 4 - 1 - HIDDEN_SIZE = 20 - index = [i for i in range(x.shape[0])] res = list(zip(x, y, scale)) np.random.shuffle(res) @@ -239,10 +265,10 @@ def __call__(self, out, input): R = ( scale * 1 - / np.sqrt(2 * np.pi * sigma**2) - * paddle.exp(-((x - mu) ** 2) / (2 * sigma**2)) + / np.sqrt(2 * np.pi * SIGMA**2) + * paddle.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) ) - self.h = rInlet - R + self.h = R_INLET - R u = out["u"] # The no-slip condition of velocity on the wall new_out["u"] = u * (self.h**2 - y**2) @@ -270,7 +296,7 @@ def __call__(self, out, input): model_4.register_output_transform(shared_transform) model = ppsci.arch.ModelList([model_2, model_3, model_4]) - optimizer2 = ppsci.optimizer.Adam( + optimizer = ppsci.optimizer.Adam( LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 )([model]) @@ -302,53 +328,27 @@ def __call__(self, out, input): model, {pde_constraint.name: pde_constraint}, output_dir, - optimizer2, + optimizer, epochs=EPOCHS, iters_per_epoch=int(x.shape[0] / BATCH_SIZE), eval_during_train=False, save_freq=10, log_freq=1, equation=equation, - checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504/checkpoints/epoch_280", + checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504/checkpoints/epoch_500", ) # solver.train() - def predict( - input_dict, - solver, - ): - for key, val in input_dict.items(): - input_dict[key] = paddle.to_tensor(val, dtype="float32") - evaluator = ppsci.utils.expression.ExpressionSolver( - input_dict.keys(), ["u", "v", "p"], solver.model - ) - output_expr_dict = { - "u": lambda d: d["u"], - "v": lambda d: d["v"], - "p": lambda d: d["p"], - } - for output_key, output_expr in output_expr_dict.items(): - evaluator.add_target_expr(output_expr, output_key) - output_dict = evaluator(input_dict) - return output_dict - def single_test(x, y, scale, caseIdx): + def single_test(x, y, scale, solver): xt = paddle.to_tensor(x, dtype="float32") yt = paddle.to_tensor(y, dtype="float32") scalet = scale * paddle.ones_like(xt) net_in = {"x": xt, "y": yt, "scale": scalet} output_dict = predict(net_in, solver) - np.savez( - "./" + str(int(caseIdx)) + "ML_WallStress_uvp", - x_center=x, - y_center=y, - u_center=output_dict["u"], - v_center=output_dict["v"], - p_center=output_dict["p"], - ) return output_dict - scale_test = np.load("aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ + scale_test = np.load("./data/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ "scale" ] os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") @@ -370,13 +370,13 @@ def single_test(x, y, scale, caseIdx): U = Data_NN["U"] n = len(x) output_dict = single_test( - x.reshape(n, 1), y.reshape(n, 1), np.ones((n, 1)) * scale, caseIdx + x.reshape(n, 1), y.reshape(n, 1), np.ones((n, 1)) * scale, solver ) u, v, p = output_dict["u"], output_dict["v"], output_dict["p"] w = np.zeros_like(u) U = np.concatenate([u, v, w], axis=1) - # velocity U + # Streamwise velocity component u plt.figure() plt.subplot(212) plt.scatter(x, y, c=U[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) @@ -393,7 +393,7 @@ def single_test(x, y, scale, caseIdx): bbox_inches="tight", ) - # velocity V + # Spanwise velocity component v plt.figure() plt.subplot(212) plt.scatter(x, y, c=U[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) @@ -411,7 +411,7 @@ def single_test(x, y, scale, caseIdx): ) plt.close("all") - # wall shear stress + # Centerline wall shear profile tau_c Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") unique_x = Data_CFD_wss["x"] wall_shear_mag_up = Data_CFD_wss["wss"] @@ -442,7 +442,7 @@ def single_test(x, y, scale, caseIdx): plt.ylabel(r"$\tau_{c}$", fontsize=16) plt.legend(prop={"size": 16}) plt.savefig( - "plot/" + str(int(caseIdx)) + "_nu_" + str(nu) + "_wallshear_test.png", + "plot/" + str(int(caseIdx)) + "_nu_" + str(NU) + "_wallshear_test.png", bbox_inches="tight", ) plt.close("all") diff --git a/examples/aneurysm/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz b/examples/aneurysm/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz deleted file mode 100644 index f84b6c2acf463ac4f7fb12fb6283c808f633f990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4244 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 diff --git a/examples/aneurysm/plot_geoaneurysm.py b/examples/aneurysm/plot_geoaneurysm.py deleted file mode 100644 index c564f73c7..000000000 --- a/examples/aneurysm/plot_geoaneurysm.py +++ /dev/null @@ -1,141 +0,0 @@ -import os - -import matplotlib.pyplot as plt -import numpy as np -import single_test - -scale_test = np.load("aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")["scale"] -os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") -caseCount = [1.0, 151.0, 486.0] - -W_ctl = np.zeros([len(scale_test), 1]) -W_ctl_Ml = np.zeros([len(scale_test), 1]) - -# aneurysm -plot_x = 0.8 -plot_y = 0.06 -fontsize = 14 -axis_limit = [0, 1, -0.15, 0.15] -path = "Cases/" -for caseIdx in caseCount: - ## geo_case - scale = scale_test[int(caseIdx - 1)] - - nu = 1e-3 - - dP = 0.1 - mu = 0.5 - sigma = 0.1 - epochs = 500 - ## Aneurysm - ## - token = "aneurysm0005to002" - token1 = "aneurysm0to002" - - ###################################################################### - # BELOW SHOULD REAMIN UNCHANGED!!!! - ###################################################################### - - print("path is", path + str(caseIdx)) - - Data_CFD = np.load(path + str(caseIdx) + "CFD_contour.npz") - Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") - x = Data_CFD["x"] - y = Data_CFD["y"] - U_CFD = Data_CFD["U"] - U = Data_NN["U"] - - device = "cpu" - u, v, p = single_test.det_test( - x, y, nu, dP, mu, sigma, scale, epochs, path, device, caseIdx - ) - print("shape of u", u.shape) - print("shape of v", v.shape) - print("shape of p", p.shape) - w = np.zeros_like(u) - U = np.concatenate([u, v, w], axis=1) - - # Contour Comparison - - plt.figure() - plt.subplot(212) - plt.scatter(x, y, c=U[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) - plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.colorbar() - plt.subplot(211) - plt.scatter(x, y, c=U_CFD[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) - plt.colorbar() - plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.savefig( - "plot/" + str(int(caseIdx)) + "scale" + str(scale) + "uContour_test.png", - bbox_inches="tight", - ) - - print( - "path is", - "plot/" + str(int(caseIdx)) + "scale" + str(scale) + "uContour_test.png", - ) - - plt.figure() - plt.subplot(212) - plt.scatter(x, y, c=U[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) - plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.colorbar() - plt.subplot(211) - plt.scatter(x, y, c=U_CFD[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) - plt.colorbar() - plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) - plt.axis(axis_limit) - plt.savefig( - "plot/" + str(int(caseIdx)) + "scale" + str(scale) + "vContour_test.png", - bbox_inches="tight", - ) - - plt.close("all") - # plt.show() - - Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") - unique_x = Data_CFD_wss["x"] - wall_shear_mag_up = Data_CFD_wss["wss"] - Data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") - NNwall_shear_mag_up = Data_NN_wss["wss"] - # show plot - - plt.figure() - - plt.plot( - unique_x, - wall_shear_mag_up, - label="CFD", - color="darkblue", - linestyle="-", - lw=3.0, - alpha=1.0, - ) - plt.plot( - unique_x, - NNwall_shear_mag_up, - label="DNN", - color="red", - linestyle="--", - dashes=(5, 5), - lw=2.0, - alpha=1.0, - ) - plt.xlabel(r"x", fontsize=16) - plt.ylabel(r"$\tau_{c}$", fontsize=16) - plt.legend(prop={"size": 16}) - plt.savefig( - "plot/" + str(int(caseIdx)) + "nu" + str(nu) + "wallShear_test.png", - bbox_inches="tight", - ) - plt.close("all") - - ## show center wall shear - # CFD - W_ctl[int(caseIdx - 1)] = wall_shear_mag_up[int(len(wall_shear_mag_up) / 2)] - # NN - W_ctl_Ml[int(caseIdx - 1)] = NNwall_shear_mag_up[int(len(NNwall_shear_mag_up) / 2)] diff --git a/examples/aneurysm/single_test.py b/examples/aneurysm/single_test.py deleted file mode 100644 index 24bdf9c29..000000000 --- a/examples/aneurysm/single_test.py +++ /dev/null @@ -1,57 +0,0 @@ -import math -from math import pi - -import numpy as np -import paddle -import torch - - -def det_test(x, y, dP, mu, sigma, scale, path1, caseIdx): - R = ( - scale - * 1 - / math.sqrt(2 * np.pi * sigma**2) - * np.exp(-((x - mu) ** 2) / (2 * sigma**2)) - ) - rInlet = 0.05 - yUp = rInlet - R - xt = paddle.to_tensor(xt, dtype="float32") - yt = paddle.to_tensor(xt, dtype="float32") - scalet = paddle.to_tensor(xt, dtype="float32") - xt = xt.view(len(xt), -1) - yt = yt.view(len(yt), -1) - scalet = scale * paddle.ones_like(xt) - Rt = paddle.to_tensor(yUp, dtype="float32") - Rt = Rt.view(len(Rt), -1) - xt.requires_grad = True - yt.requires_grad = True - scalet.requires_grad = True - net_in = torch.cat((xt, yt, scalet), 1) - u_t = net2(net_in) - v_t = net3(net_in) - P_t = net4(net_in) - u_hard = u_t * (Rt**2 - yt**2) - v_hard = (Rt**2 - yt**2) * v_t - L = 1 - xStart = 0 - xEnd = L - P_hard = ( - (xStart - xt) * 0 - + dP * (xEnd - xt) / L - + 0 * yt - + (xStart - xt) * (xEnd - xt) * P_t - ) - u_hard = u_hard.numpy() - v_hard = v_hard.numpy() - P_hard = P_hard.numpy() - - np.savez( - path1 + str(int(caseIdx)) + "ML_WallStress_uvp", - x_center=x, - y_center=y, - u_center=u_hard, - v_center=v_hard, - p_center=P_hard, - ) - - return u_hard, v_hard, P_hard From 7d957c9c12e862c2cc47f63284acb5e0a3166e2c Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Wed, 24 May 2023 05:00:31 +0000 Subject: [PATCH 09/31] using xvaier instead tf net initial params --- ...aneurysm_flow_FCNN.py => aneurysm_flow.py} | 141 +----------------- ...euille_flow_FCNN.py => poiseuille_flow.py} | 51 +++---- 2 files changed, 34 insertions(+), 158 deletions(-) rename examples/aneurysm/{aneurysm_flow_FCNN.py => aneurysm_flow.py} (68%) rename examples/pipe/{poiseuille_flow_FCNN.py => poiseuille_flow.py} (91%) diff --git a/examples/aneurysm/aneurysm_flow_FCNN.py b/examples/aneurysm/aneurysm_flow.py similarity index 68% rename from examples/aneurysm/aneurysm_flow_FCNN.py rename to examples/aneurysm/aneurysm_flow.py index 86700fcaf..1c5d526d2 100644 --- a/examples/aneurysm/aneurysm_flow_FCNN.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -1,5 +1,4 @@ import math -import os import matplotlib.pyplot as plt import numpy as np @@ -7,8 +6,6 @@ from paddle.fluid import core import ppsci -from ppsci.autodiff import hessian -from ppsci.autodiff import jacobian def ThreeD_mesh(x_2d, tmp_1d): @@ -21,100 +18,6 @@ def ThreeD_mesh(x_2d, tmp_1d): return x, tmp_3d -class NavierStokes(ppsci.equation.pde.base.PDE): - """Class for navier-stokes equation. - - Args: - rho (float): Density. - dim (int): Dimension of equation. - time (bool): Whether the euqation is time-dependent. - """ - - def __init__(self, rho: float, dim: int, time: bool): - super().__init__() - self.rho = rho - self.dim = dim - self.time = time - - def continuity_compute_func(out): - x, y = out["x"], out["y"] - u, v = out["u"], out["v"] - continuity = jacobian(u, x) + jacobian(v, y) - - if self.dim == 3: - z = out["z"] - w = out["w"] - continuity += jacobian(w, z) - return continuity - - self.add_equation("continuity", continuity_compute_func) - - def momentum_x_compute_func(out): - x, y = out["x"], out["y"] - u, v, p = out["u"], out["v"], out["p"] - momentum_x = ( - u * jacobian(u, x) - + v * jacobian(u, y) - - NU / rho * hessian(u, x) - - NU / rho * hessian(u, y) - + 1 / rho * jacobian(p, x) - ) - if self.time: - t = out["t"] - momentum_x += jacobian(u, t) - if self.dim == 3: - z = out["z"] - w = out["w"] - momentum_x += w * jacobian(u, z) - momentum_x -= NU / rho * hessian(u, z) - return momentum_x - - self.add_equation("momentum_x", momentum_x_compute_func) - - def momentum_y_compute_func(out): - x, y = out["x"], out["y"] - u, v, p = out["u"], out["v"], out["p"] - momentum_y = ( - u * jacobian(v, x) - + v * jacobian(v, y) - - NU / rho * hessian(v, x) - - NU / rho * hessian(v, y) - + 1 / rho * jacobian(p, y) - ) - if self.time: - t = out["t"] - momentum_y += jacobian(v, t) - if self.dim == 3: - z = out["z"] - w = out["w"] - momentum_y += w * jacobian(v, z) - momentum_y -= NU / rho * hessian(v, z) - return momentum_y - - self.add_equation("momentum_y", momentum_y_compute_func) - - if self.dim == 3: - - def momentum_z_compute_func(out): - x, y = out["x"], out["y"] - u, v, w, p = out["u"], out["v"], out["w"], out["p"] - momentum_z = ( - u * jacobian(w, x) - + v * jacobian(w, y) - + w * jacobian(w, z) - - NU / rho * hessian(w, x) - - NU / rho * hessian(w, y) - - NU / rho * hessian(w, z) - + 1 / rho * jacobian(p, z) - ) - if self.time: - t = out["t"] - momentum_z += jacobian(w, t) - return momentum_z - - self.add_equation("momentum_z", momentum_z_compute_func) - - def predict( input_dict, solver, @@ -136,12 +39,11 @@ def predict( if __name__ == "__main__": - os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) # set output directory - output_dir = "./output_0504_debug" + output_dir = "./output_aneurysm_debug" # initialize logger ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") @@ -212,45 +114,20 @@ def predict( scale = np.array(scale).astype(float) interior_geom = ppsci.geometry.PointCloud( - coord_dict={"x": x, "y": y}, - extra_data={"scale": scale}, - data_key=["x", "y", "scale"], + interior={"x": x, "y": y, "scale": scale}, + coord_keys=["x", "y", "scale"], ) model_2 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["u"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - np.load(f"data/net2_params/weight_epoch_0.npz"), - np.load(f"data/net2_params/bias_epoch_0.npz"), + ["x", "y", "scale"], ["u"], LAYER_NUMBER, HIDDEN_SIZE, "swish", False, False ) model_3 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["v"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - np.load(f"data/net3_params/weight_epoch_0.npz"), - np.load(f"data/net3_params/bias_epoch_0.npz"), + ["x", "y", "scale"], ["v"], LAYER_NUMBER, HIDDEN_SIZE, "swish", False, False ) model_4 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["p"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - np.load(f"data/net4_params/weight_epoch_0.npz"), - np.load(f"data/net4_params/bias_epoch_0.npz"), + ["x", "y", "scale"], ["p"], LAYER_NUMBER, HIDDEN_SIZE, "swish", False, False ) class Output_transform: @@ -300,7 +177,7 @@ def __call__(self, out, input): LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 )([model]) - equation = {"NavierStokes": NavierStokes(RHO, 2, False)} + equation = {"NavierStokes": ppsci.equation.NavierStokes(NU, RHO, 2, False)} pde_constraint = ppsci.constraint.InteriorConstraint( equation["NavierStokes"].equations, @@ -335,10 +212,9 @@ def __call__(self, out, input): save_freq=10, log_freq=1, equation=equation, - checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504/checkpoints/epoch_500", ) - # solver.train() + solver.train() def single_test(x, y, scale, solver): xt = paddle.to_tensor(x, dtype="float32") @@ -351,7 +227,6 @@ def single_test(x, y, scale, solver): scale_test = np.load("./data/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ "scale" ] - os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") caseCount = [1.0, 151.0, 486.0] W_ctl = np.zeros([len(scale_test), 1]) W_ctl_Ml = np.zeros([len(scale_test), 1]) diff --git a/examples/pipe/poiseuille_flow_FCNN.py b/examples/pipe/poiseuille_flow.py similarity index 91% rename from examples/pipe/poiseuille_flow_FCNN.py rename to examples/pipe/poiseuille_flow.py index df220c0d7..332d8a0f4 100644 --- a/examples/pipe/poiseuille_flow_FCNN.py +++ b/examples/pipe/poiseuille_flow.py @@ -145,10 +145,8 @@ def predict( # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) - os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/pipe") # set output directory - output_dir = "./output" - dir = "./data/net_params" + output_dir = "./output_poiseuille_flow" core.set_prim_eager_enabled(True) @@ -202,9 +200,8 @@ def predict( interior_data = {"x": input_x, "y": input_y, "nu": input_nu} interior_geom = ppsci.geometry.PointCloud( - coord_dict={"x": input_x, "y": input_y}, - extra_data={"nu": input_nu}, - data_key=["x", "y", "nu"], + interior={"x": input_x, "y": input_y, "nu": input_nu}, + coord_keys=["x", "y", "nu"], ) # set model @@ -216,8 +213,6 @@ def predict( "swish_beta", False, False, - np.load(dir + f"/weight_u_epoch_1.npz"), - np.load(dir + f"/bias_u_epoch_1.npz"), ) model_v = ppsci.arch.MLP( @@ -228,8 +223,6 @@ def predict( "swish_beta", False, False, - np.load(dir + f"/weight_v_epoch_1.npz"), - np.load(dir + f"/bias_v_epoch_1.npz"), ) model_p = ppsci.arch.MLP( @@ -240,8 +233,8 @@ def predict( "swish_beta", False, False, - np.load(dir + f"/weight_p_epoch_1.npz"), - np.load(dir + f"/bias_p_epoch_1.npz"), + # np.load(dir + f"/weight_p_epoch_1.npz"), + # np.load(dir + f"/bias_p_epoch_1.npz"), ) def output_transform(out, input): @@ -335,9 +328,10 @@ def input_transform(input): save_freq=10, log_freq=LOG_FREQ, equation=equation, - checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/pipe/output/checkpoints/epoch_3000", ) + solver.train() + # Cross-section velocity profiles of 4 different viscosity sample # Predicted result input_dict = { @@ -351,12 +345,12 @@ def input_transform(input): p_pred = output_dict["p"].numpy().reshape(N_y, N_x, N_p) # Analytical result, y = data_1d_y - uSolaM = np.zeros([N_y, N_x, N_p]) + u_analytical = np.zeros([N_y, N_x, N_p]) dP = P_IN - P_OUT for i in range(N_p): uy = (R**2 - data_1d_y**2) * dP / (2 * L * data_1d_nu[i] * RHO) - uSolaM[:, :, i] = np.tile(uy.reshape([N_y, 1]), N_x) + u_analytical[:, :, i] = np.tile(uy.reshape([N_y, 1]), N_x) fontsize = 16 idx_X = int(round(N_x / 2)) # pipe velocity section at L/2 @@ -370,7 +364,7 @@ def input_transform(input): ax1 = plt.subplot(111) plt.plot( data_1d_y, - uSolaM[:, idx_X, nu_index[idxP]], + u_analytical[:, idx_X, nu_index[idxP]], color="darkblue", linestyle="-", lw=3.0, @@ -403,10 +397,12 @@ def input_transform(input): # Distribution of center velocity # Predicted result - N_pTest = 500 - data_1d_nuDist = np.random.normal(NU_MEAN, 0.2 * NU_MEAN, N_pTest) + num_test = 500 + data_1d_nu_distribution = np.random.normal(NU_MEAN, 0.2 * NU_MEAN, num_test) data_2d_xy_test = ( - np.array(np.meshgrid((X_IN - X_OUT) / 2.0, 0, data_1d_nuDist)).reshape(3, -1).T + np.array(np.meshgrid((X_IN - X_OUT) / 2.0, 0, data_1d_nu_distribution)) + .reshape(3, -1) + .T ) input_dict_test = { @@ -415,22 +411,27 @@ def input_transform(input): "nu": data_2d_xy_test[:, 2:3], } output_dict_test = predict(input_dict_test, solver) - uMax_pred = output_dict_test["u"].numpy() + u_max_pred = output_dict_test["u"].numpy() # Analytical result, y = 0 - uMax_a = np.zeros([N_pTest, 1]) - for i in range(N_pTest): - uMax_a[i] = (R**2) * dP / (2 * L * data_1d_nuDist[i] * RHO) + u_max_a = np.zeros([num_test, 1]) + for i in range(num_test): + u_max_a[i] = (R**2) * dP / (2 * L * data_1d_nu_distribution[i] * RHO) # Plot plt.figure(2) plt.clf() ax1 = plt.subplot(111) sns.kdeplot( - uMax_a, fill=True, color="black", label="Analytical", linestyle="-", linewidth=3 + u_max_a, + fill=True, + color="black", + label="Analytical", + linestyle="-", + linewidth=3, ) sns.kdeplot( - uMax_pred, + u_max_pred, fill=False, color="red", label="DNN", From 683adc787b3dfb36206f331175086043ad7fe4d5 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Wed, 31 May 2023 03:02:37 +0000 Subject: [PATCH 10/31] muli opt:w --- examples/aneurysm/aneurysm_flow.py | 191 +++++++++++++----- .../aneurysm/data/net2_params/bias_0_0.npz | Bin 1218 -> 0 bytes .../data/net2_params/bias_epoch_0.npz | Bin 1218 -> 0 bytes .../data/net2_params/bias_grad_0_0.npz | Bin 1218 -> 0 bytes .../data/net2_params/bias_grad_0_1.npz | Bin 1218 -> 0 bytes .../aneurysm/data/net2_params/weight_0_0.npz | Bin 4494 -> 0 bytes .../data/net2_params/weight_epoch_0.npz | Bin 4494 -> 0 bytes .../data/net2_params/weight_grad_0_0.npz | Bin 4494 -> 0 bytes .../data/net2_params/weight_grad_0_1.npz | Bin 4494 -> 0 bytes .../aneurysm/data/net3_params/bias_0_0.npz | Bin 1218 -> 0 bytes .../data/net3_params/bias_epoch_0.npz | Bin 1218 -> 0 bytes .../data/net3_params/bias_grad_0_0.npz | Bin 1218 -> 0 bytes .../data/net3_params/bias_grad_0_1.npz | Bin 1218 -> 0 bytes .../aneurysm/data/net3_params/weight_0_0.npz | Bin 4494 -> 0 bytes .../data/net3_params/weight_epoch_0.npz | Bin 4494 -> 0 bytes .../data/net3_params/weight_grad_0_0.npz | Bin 4494 -> 0 bytes .../data/net3_params/weight_grad_0_1.npz | Bin 4494 -> 0 bytes .../aneurysm/data/net4_params/bias_0_0.npz | Bin 1218 -> 0 bytes .../data/net4_params/bias_epoch_0.npz | Bin 1218 -> 0 bytes .../data/net4_params/bias_grad_0_0.npz | Bin 1218 -> 0 bytes .../data/net4_params/bias_grad_0_1.npz | Bin 1218 -> 0 bytes .../aneurysm/data/net4_params/weight_0_0.npz | Bin 4494 -> 0 bytes .../data/net4_params/weight_epoch_0.npz | Bin 4494 -> 0 bytes .../data/net4_params/weight_grad_0_0.npz | Bin 4494 -> 0 bytes .../data/net4_params/weight_grad_0_1.npz | Bin 4494 -> 0 bytes .../pipe/data/net_params/bias_p_epoch_1.npz | Bin 1578 -> 0 bytes .../pipe/data/net_params/bias_u_epoch_1.npz | Bin 1578 -> 0 bytes .../pipe/data/net_params/bias_v_epoch_1.npz | Bin 1578 -> 0 bytes .../pipe/data/net_params/weight_p_epoch_1.npz | Bin 21974 -> 0 bytes .../pipe/data/net_params/weight_u_epoch_1.npz | Bin 21974 -> 0 bytes .../pipe/data/net_params/weight_v_epoch_1.npz | Bin 21974 -> 0 bytes ppsci/optimizer/__init__.py | 12 +- ppsci/optimizer/optimizer.py | 59 ++++++ ppsci/solver/train.py | 23 ++- ppsci/utils/initializer.py | 8 + 35 files changed, 233 insertions(+), 60 deletions(-) delete mode 100644 examples/aneurysm/data/net2_params/bias_0_0.npz delete mode 100644 examples/aneurysm/data/net2_params/bias_epoch_0.npz delete mode 100644 examples/aneurysm/data/net2_params/bias_grad_0_0.npz delete mode 100644 examples/aneurysm/data/net2_params/bias_grad_0_1.npz delete mode 100644 examples/aneurysm/data/net2_params/weight_0_0.npz delete mode 100644 examples/aneurysm/data/net2_params/weight_epoch_0.npz delete mode 100644 examples/aneurysm/data/net2_params/weight_grad_0_0.npz delete mode 100644 examples/aneurysm/data/net2_params/weight_grad_0_1.npz delete mode 100644 examples/aneurysm/data/net3_params/bias_0_0.npz delete mode 100644 examples/aneurysm/data/net3_params/bias_epoch_0.npz delete mode 100644 examples/aneurysm/data/net3_params/bias_grad_0_0.npz delete mode 100644 examples/aneurysm/data/net3_params/bias_grad_0_1.npz delete mode 100644 examples/aneurysm/data/net3_params/weight_0_0.npz delete mode 100644 examples/aneurysm/data/net3_params/weight_epoch_0.npz delete mode 100644 examples/aneurysm/data/net3_params/weight_grad_0_0.npz delete mode 100644 examples/aneurysm/data/net3_params/weight_grad_0_1.npz delete mode 100644 examples/aneurysm/data/net4_params/bias_0_0.npz delete mode 100644 examples/aneurysm/data/net4_params/bias_epoch_0.npz delete mode 100644 examples/aneurysm/data/net4_params/bias_grad_0_0.npz delete mode 100644 examples/aneurysm/data/net4_params/bias_grad_0_1.npz delete mode 100644 examples/aneurysm/data/net4_params/weight_0_0.npz delete mode 100644 examples/aneurysm/data/net4_params/weight_epoch_0.npz delete mode 100644 examples/aneurysm/data/net4_params/weight_grad_0_0.npz delete mode 100644 examples/aneurysm/data/net4_params/weight_grad_0_1.npz delete mode 100644 examples/pipe/data/net_params/bias_p_epoch_1.npz delete mode 100644 examples/pipe/data/net_params/bias_u_epoch_1.npz delete mode 100644 examples/pipe/data/net_params/bias_v_epoch_1.npz delete mode 100644 examples/pipe/data/net_params/weight_p_epoch_1.npz delete mode 100644 examples/pipe/data/net_params/weight_u_epoch_1.npz delete mode 100644 examples/pipe/data/net_params/weight_v_epoch_1.npz diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 1c5d526d2..fb20c0415 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -1,4 +1,5 @@ import math +import os.path as osp import matplotlib.pyplot as plt import numpy as np @@ -6,16 +7,13 @@ from paddle.fluid import core import ppsci +from ppsci.utils import misc -def ThreeD_mesh(x_2d, tmp_1d): - tmp_3d = np.expand_dims(np.tile(tmp_1d, len(x_2d)), 1).astype("float") - x = [] - for x0 in x_2d: - tmpx = np.tile(x0, len(tmp_1d)) - x.append(tmpx) - x = np.reshape(x, (len(tmp_3d), 1)) - return x, tmp_3d +def generate_scale_for_all_x(x, scale): + new_scale = np.tile(scale, (len(x), 1)) + new_x = np.array([np.tile(val, len(scale)) for val in x]).reshape(len(new_scale), 1) + return new_x, new_scale def predict( @@ -41,20 +39,21 @@ def predict( if __name__ == "__main__": # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) + import os + os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") # set output directory - output_dir = "./output_aneurysm_debug" - + OUTPUT_DIR = "./output_0531" + PLOT_DIR = osp.join(OUTPUT_DIR, "visu") + os.makedirs(PLOT_DIR, exist_ok=True) # initialize logger - ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") + ppsci.utils.logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") core.set_prim_eager_enabled(True) # Hyper parameters - EPOCHS = 500 + EPOCHS = 1 BATCH_SIZE = 50 LEARNING_RATE = 1e-3 - LAYER_NUMBER = 4 - 1 - HIDDEN_SIZE = 20 # Physic properties P_OUT = 0 # pressure at the outlet of pipe @@ -70,13 +69,20 @@ def predict( unique_x = np.linspace(X_IN, X_OUT, 100) mu = 0.5 * (X_OUT - X_IN) N_y = 20 - x_2d = np.tile(unique_x, N_y) - x_2d = np.reshape(x_2d, (len(x_2d), 1)) + x_inital = np.linspace(X_IN, X_OUT, 100, dtype=paddle.get_default_dtype()).reshape( + 100, 1 + ) + mu = 0.5 * (X_OUT - X_IN) + x_20_copy = np.tile(x_inital, (20, 1)) # duplicate 20 times of x for dataloader SIGMA = 0.1 SCALE_START = -0.02 SCALE_END = 0 - scale_1d = np.linspace(SCALE_START, SCALE_END, 50, endpoint=True) - x, scale = ThreeD_mesh(x_2d, scale_1d) + scale_initial = np.linspace( + SCALE_START, SCALE_END, 50, endpoint=True, dtype=paddle.get_default_dtype() + ).reshape(50, 1) + x, scale = generate_scale_for_all_x( + x_20_copy, scale_initial + ) # generate 50 scale factors for each x (mesh grid) # Axisymetric boundary R = ( @@ -86,49 +92,128 @@ def predict( * np.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) ) - # Generate stenosis + # Visualize stenosis(scale == 0.2) y_up = (R_INLET - R) * np.ones_like(x) y_down = (-R_INLET + R) * np.ones_like(x) - idx = np.where(scale == SCALE_START) + idx = np.where(scale == 0) # plot vessel which scale is 0.2 by finding its indexs plt.figure() plt.scatter(x[idx], y_up[idx]) plt.scatter(x[idx], y_down[idx]) plt.axis("equal") plt.show() - plt.savefig("./plot/idealized_stenotid_vessel", bbox_inches="tight") + plt.savefig(osp.join(PLOT_DIR, "idealized_stenotid_vessel"), bbox_inches="tight") # Points and shuffle(for alignment) y = np.zeros([len(x), 1]) - for x0 in unique_x: + for x0 in x_inital: index = np.where(x[:, 0] == x0)[0] Rsec = max(y_up[index]) - tmpy = np.linspace(-Rsec, Rsec, len(index)).reshape(len(index), -1) - y[index] = tmpy - - index = [i for i in range(x.shape[0])] - res = list(zip(x, y, scale)) - np.random.shuffle(res) - x, y, scale = zip(*res) - x = np.array(x).astype(float) - y = np.array(y).astype(float) - scale = np.array(scale).astype(float) + # y is linear to scale, so we place linespace to get 1000 x, it coressponds to vessels + y[index] = np.linspace(-Rsec, Rsec, len(index)).reshape(len(index), -1) + idx = np.where(scale == 0) # plot vessel which scale is 0.2 by finding its indexs + plt.figure() + plt.scatter(x[idx], y[idx]) + plt.axis("equal") + plt.show() + plt.savefig(osp.join(PLOT_DIR, "one_scale_sample"), bbox_inches="tight") + + # index = [i for i in range(x.shape[0])] + # res = list(zip(x, y, scale)) + # np.random.shuffle(res) + # x, y, scale = zip(*res) + # x = np.array(x).astype(float) + # y = np.array(y).astype(float) + # scale = np.array(scale).astype(float) + + np.savez("x_0526_pd", x=x) + np.savez("y_0526_pd", y=y) + np.savez("scale_0526_pd", scale=scale) interior_geom = ppsci.geometry.PointCloud( interior={"x": x, "y": y, "scale": scale}, coord_keys=["x", "y", "scale"], ) + def _calculate_fan_in_and_fan_out(tensor): + if tensor.ndim < 2: + raise ValueError( + f"tensor.ndim should be no less than 2, but got {tensor.ndim}." + ) + num_input_fmaps = tensor.shape[1] + num_output_fmaps = tensor.shape[0] + receptive_field_size = 1 + if tensor.ndim > 2: + receptive_field_size = np.prod(tensor.shape[2:]) + fan_in = num_input_fmaps * receptive_field_size + fan_out = num_output_fmaps * receptive_field_size + return fan_in, fan_out + + def init_func(m): + if misc.typename(m) == "Linear": + ppsci.utils.initializer.kaiming_normal_(m.weight, reverse=True) + + model_1 = ppsci.arch.MLP( + ["x", "y", "scale"], + ["u"], + 3, + 20, + "swish", + False, + False, + np.load( + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net2_params/weight_0_0.npz" + ), + np.load( + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net2_params/bias_0_0.npz" + ), + ) + model_2 = ppsci.arch.MLP( - ["x", "y", "scale"], ["u"], LAYER_NUMBER, HIDDEN_SIZE, "swish", False, False + ["x", "y", "scale"], + ["v"], + 3, + 20, + "swish", + False, + False, + np.load( + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net3_params/weight_0_0.npz" + ), + np.load( + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net3_params/bias_0_0.npz" + ), ) model_3 = ppsci.arch.MLP( - ["x", "y", "scale"], ["v"], LAYER_NUMBER, HIDDEN_SIZE, "swish", False, False + ["x", "y", "scale"], + ["p"], + 3, + 20, + "swish", + False, + False, + np.load( + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net4_params/weight_0_0.npz" + ), + np.load( + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net4_params/bias_0_0.npz" + ), ) + # model_1.apply(init_func) + # model_2.apply(init_func) + # model_3.apply(init_func) - model_4 = ppsci.arch.MLP( - ["x", "y", "scale"], ["p"], LAYER_NUMBER, HIDDEN_SIZE, "swish", False, False - ) + # print(f"layer 1 mean : {np.mean(model_1.linears[0].weight.numpy())}") + # print(f"layer 1 var : {np.var(model_1.linears[0].weight.numpy())}") + + # print(f"layer 2 mean : {np.mean(model_1.linears[1].weight.numpy())}") + # print(f"layer 2 var : {np.var(model_1.linears[1].weight.numpy())}") + + # print(f"layer 3 mean : {np.mean(model_1.linears[2].weight.numpy())}") + # print(f"layer 3 var : {np.var(model_1.linears[2].weight.numpy())}") + + # print(f"layer 4 mean : {np.mean(model_1.last_fc.weight.numpy())}") + # print(f"layer 4 var : {np.var(model_1.last_fc.weight.numpy())}") class Output_transform: def __init__(self) -> None: @@ -168,14 +253,21 @@ def __call__(self, out, input): return new_out shared_transform = Output_transform() + model_1.register_output_transform(shared_transform) model_2.register_output_transform(shared_transform) model_3.register_output_transform(shared_transform) - model_4.register_output_transform(shared_transform) - model = ppsci.arch.ModelList([model_2, model_3, model_4]) + model = ppsci.arch.ModelList([model_1, model_2, model_3]) - optimizer = ppsci.optimizer.Adam( + optimizer_1 = ppsci.optimizer.Adam( + LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 + )([model_1]) + optimizer_2 = ppsci.optimizer.Adam( + LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 + )([model_2]) + optimizer_3 = ppsci.optimizer.Adam( LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 - )([model]) + )([model_3]) + optimizer = ppsci.optimizer.OptimizerList((optimizer_1, optimizer_2, optimizer_3)) equation = {"NavierStokes": ppsci.equation.NavierStokes(NU, RHO, 2, False)} @@ -204,7 +296,7 @@ def __call__(self, out, input): solver = ppsci.solver.Solver( model, {pde_constraint.name: pde_constraint}, - output_dir, + OUTPUT_DIR, optimizer, epochs=EPOCHS, iters_per_epoch=int(x.shape[0] / BATCH_SIZE), @@ -212,6 +304,7 @@ def __call__(self, out, input): save_freq=10, log_freq=1, equation=equation, + # checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504_debug/checkpoints/epoch_300" ) solver.train() @@ -221,7 +314,7 @@ def single_test(x, y, scale, solver): yt = paddle.to_tensor(y, dtype="float32") scalet = scale * paddle.ones_like(xt) net_in = {"x": xt, "y": yt, "scale": scalet} - output_dict = predict(net_in, solver) + output_dict = solver.predict(net_in, 10000) return output_dict scale_test = np.load("./data/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ @@ -264,7 +357,7 @@ def single_test(x, y, scale, solver): plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) plt.axis(axis_limit) plt.savefig( - "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_uContour_test.png", + osp.join(PLOT_DIR, f"{int(caseIdx)}_scale_{scale}_uContour_test.png"), bbox_inches="tight", ) @@ -281,21 +374,21 @@ def single_test(x, y, scale, solver): plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) plt.axis(axis_limit) plt.savefig( - "plot/" + str(int(caseIdx)) + "_scale_" + str(scale) + "_vContour_test.png", + osp.join(PLOT_DIR, f"{int(caseIdx)}_scale_{scale}_vContour_test.png"), bbox_inches="tight", ) plt.close("all") # Centerline wall shear profile tau_c Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") - unique_x = Data_CFD_wss["x"] + x_inital = Data_CFD_wss["x"] wall_shear_mag_up = Data_CFD_wss["wss"] Data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") NNwall_shear_mag_up = Data_NN_wss["wss"] plt.figure() plt.plot( - unique_x, + x_inital, wall_shear_mag_up, label="CFD", color="darkblue", @@ -304,7 +397,7 @@ def single_test(x, y, scale, solver): alpha=1.0, ) plt.plot( - unique_x, + x_inital, NNwall_shear_mag_up, label="DNN", color="red", @@ -317,7 +410,7 @@ def single_test(x, y, scale, solver): plt.ylabel(r"$\tau_{c}$", fontsize=16) plt.legend(prop={"size": 16}) plt.savefig( - "plot/" + str(int(caseIdx)) + "_nu_" + str(NU) + "_wallshear_test.png", + osp.join(PLOT_DIR, f"{int(caseIdx)}_nu__{scale}_wallshear_test.png"), bbox_inches="tight", ) plt.close("all") diff --git a/examples/aneurysm/data/net2_params/bias_0_0.npz b/examples/aneurysm/data/net2_params/bias_0_0.npz deleted file mode 100644 index 795af420c7965d6b32b3b2457bdc4b807f349e2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;2?K)<}(7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0YukywxlfF`*Pv5?awLp``8z{+i|L2*!%u2vz?;(<-I{&40id; z1os#^*xE(^3W5V5zv)xa)b50jn3+wXg)Iw|jCOlr5y{1|HMbA76H z%H)`R@)Gv@@-&{fF`*Pv5?awLp``8z{+i|L2*!%u2vz?;(<-I{&40id; z1os#^*xE(^3W5V5zv)xa)b50jn3+wXg)Iw|jCOlr5y{1|HMbA76H z%H)`R@)Gv@@-&{GL~Dsig(OPTxQOs@zbKw;_!AZ({c-o)6P5OP8M6- z4e+pBx!S{$f$PAI16yb8m^CrmB4akku39^eZ3)kucDnU7?g&5$h))?B^{4@1I9LP1 zeoyO;KUPxaKUY1r&`#qt6MNlgDRh)&r}Z8$&F_8*+Zpw%cc=avt)1W2 zR_(00w|Bc*JLk?Vl2(>%A3ZJdjCPm@IWbzWoA0(n4T$F_qry-F!f3Dtgx0*dJKKtn zY+KX9v$Nw-yXEIMoMw{`D_aKYiJJ+Vv+W2H`o7IpZ=*%pl1R&>o)bHgey-ZKFG0p4 zSaag$f7@7hnTcClei2-3cK?W$#e~T}(NcsV-?i}<7Hjoqx5MBY&H-J(M3;@Vk9`XPH diff --git a/examples/aneurysm/data/net2_params/bias_grad_0_1.npz b/examples/aneurysm/data/net2_params/bias_grad_0_1.npz deleted file mode 100644 index 303dfc2c3cae9c6e25c1bfa75fd937f97bb57d51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;2?>YN6v3qTGCvonY=B*h!(VMbToAo zY8A)_Tyja*cLp!A+kQty(o*v1e~U65+Z|l|OU)U0A6YOgV%)AjkHg}utnZGh7jMk3 z?6|~x?Xqhyl(bP$3yM@H5EVGQ#3EMyWC~U6^nP~Cln7ieY4_kIz;5@NSJo3M} z-#6|pKm0%Ml)0{C>6*Y`zM+oOf@l9tv=nh@qx$p~V7dokNY*fh1q4V41Yk5pS;LUh zoT0$=Yu?YD0p5&EBFwmQHpIOkvVjpqLi0JgCe&O2QV0PJjGRDiN%7!3fvyQP#lWyhS8Kemu)&btEY#=EXAiM&kZvdqj7yz@y9C!c# diff --git a/examples/aneurysm/data/net2_params/weight_0_0.npz b/examples/aneurysm/data/net2_params/weight_0_0.npz deleted file mode 100644 index 70864ce92ab56e312b49057458c47948f5e5611e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 diff --git a/examples/aneurysm/data/net2_params/weight_epoch_0.npz b/examples/aneurysm/data/net2_params/weight_epoch_0.npz deleted file mode 100644 index 70864ce92ab56e312b49057458c47948f5e5611e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 diff --git a/examples/aneurysm/data/net2_params/weight_grad_0_0.npz b/examples/aneurysm/data/net2_params/weight_grad_0_0.npz deleted file mode 100644 index 791cf4c81490b39b9fd4ebde7aa2956bc6ff6d36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 diff --git a/examples/aneurysm/data/net2_params/weight_grad_0_1.npz b/examples/aneurysm/data/net2_params/weight_grad_0_1.npz deleted file mode 100644 index 4030a2f89258ca8279cea7a5d2292d288475033c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 diff --git a/examples/aneurysm/data/net3_params/bias_0_0.npz b/examples/aneurysm/data/net3_params/bias_0_0.npz deleted file mode 100644 index f6d213126b5507df53a12cdcc3eeb9670a9dae2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;2?#gawF7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl5YBwcFf6ry>D{yF_UpYI zoIN&E0`vDgI>BYVX!}wdzr@?Nd<%Z;2~LjPJ3CTyA8J5sdo%w5YCsqb)_@3Iu4Q*) znUURu`9^zZub;E`@fBseMSmIX0{*+~J88+jFZGJWKBjFPcKZGjb|SYG_i-!=w{3U! z-M6GZVDGns^0rH!1lUbc*RU13V7V`v@4#NvfN0a=RcHaGdk}_X4P#h9fP_E*MpKkE z3@ObS3S1^7A;4Hj!}AbkTU#lQdng-Id$ diff --git a/examples/aneurysm/data/net3_params/bias_epoch_0.npz b/examples/aneurysm/data/net3_params/bias_epoch_0.npz deleted file mode 100644 index f6d213126b5507df53a12cdcc3eeb9670a9dae2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;2?#gawF7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl5YBwcFf6ry>D{yF_UpYI zoIN&E0`vDgI>BYVX!}wdzr@?Nd<%Z;2~LjPJ3CTyA8J5sdo%w5YCsqb)_@3Iu4Q*) znUURu`9^zZub;E`@fBseMSmIX0{*+~J88+jFZGJWKBjFPcKZGjb|SYG_i-!=w{3U! z-M6GZVDGns^0rH!1lUbc*RU13V7V`v@4#NvfN0a=RcHaGdk}_X4P#h9fP_E*MpKkE z3@ObS3S1^7A;4Hj!}AbkTU#lQdng-Id$ diff --git a/examples/aneurysm/data/net3_params/bias_grad_0_0.npz b/examples/aneurysm/data/net3_params/bias_grad_0_0.npz deleted file mode 100644 index 6b4f778743f17ecef2fd6bd0ff2ae662490131b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;2?5P{yi7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl+(OHyX_-5(-&?z5?h)6WGp=dx%$TQS zKA}LsvSDxe&N&am%r&dN@8}9P+-ZJ&*G~620y|bF@86NWNqc7iN5Qc*_ zATG@>+ZiOrWfhmXbi4BIB|BDJony&5`O3~Cww#umTI4OS&NtZ^;_+sO%lYh`Y`YHb zSZwIJi+RaLOO2*gJJYqyEay}nviPe1awkvlot@L3Ua>?Ch{qP~YfuBiXs`yvC;L{* zGwTmn>Ik!1MX9*&IA0RB>)s~0oo6##ELYx@-6h7uZ^h())>2PI#WJq$jHQK9<<7^P z>n&Ftd%x36gJD(}7vW77%AV5MO0HZ0& z8ithS3@eQOZnZXj^Y(Zp35(kmb(R-B+AM`kop$=J>f5o;Nn@w>daj-SdY#OR zw!F63)$X^meL<7?^u%2|D%!bs&i0+Rv-Rx7?bD}D+94J$y)ytMASN4K=Rpk!!@(L5 zAELc>P7AqjX&+Fqec$JX9f`kcEZ?o)uruH8j)ln~2FsX-!aD;`AKCG%%5kUju zFr+kRC~z?ddF>AHW@Hj!#+9=n?gfzzj35%4&(SrZ<^qsH2xwsB1Zqo)2j>ZNO{ggb srUhh^5EDofIQ^h&LJeJHP14LDP2jK&@MdKLNwEOo6(D^BD8;}40G(ze?*IS* diff --git a/examples/aneurysm/data/net3_params/weight_0_0.npz b/examples/aneurysm/data/net3_params/weight_0_0.npz deleted file mode 100644 index 90106819f3ac1c9036f2e28cf7f496c930070e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 diff --git a/examples/aneurysm/data/net3_params/weight_epoch_0.npz b/examples/aneurysm/data/net3_params/weight_epoch_0.npz deleted file mode 100644 index 90106819f3ac1c9036f2e28cf7f496c930070e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 diff --git a/examples/aneurysm/data/net3_params/weight_grad_0_0.npz b/examples/aneurysm/data/net3_params/weight_grad_0_0.npz deleted file mode 100644 index 27b272c63f44fc75a809fb9112fe0a38cbe88ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 G(fD6A?q3W5 diff --git a/examples/aneurysm/data/net3_params/weight_grad_0_1.npz b/examples/aneurysm/data/net3_params/weight_grad_0_1.npz deleted file mode 100644 index 721ec61720a4a4c36c887b62f5bd5987f217b4d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 zcmd5=Yc!YH+x`*4I8-Dghn%Alp1t=^Vj`79C?pM04#{+Is1P}YC=`lRgd`H-*?a#) zHKd6Y38k7uLQT;@qT@@wv(_|gy&vBHeEHvN-Opan{oL1wy{>gX*S@x`)g%FF&i7E^ zSgchN+|I}0Oyp#aG-sEa-n^~bgZVg9zLh50CO%C>s*QuStur5ICnr>MlV`w2e@!E0 zO=B-ZOePU}IY%z8hS zIPQQ&8|xT8)kyHRILE*@OrkPU)&;ena{$Sy`E1*p8#Ki9I4+Ez3M~A_z#i>n!>64K zD|bW+(%Pb0R^BR}QC|^9AJuALZpAgmDPD``kw1!$mbw7x;gf8Ulqfryd&=;7ogme# zeZVFiU&UBf9H*yVc;cIC_ZizCh^h!Pkh&to;Y{Rrq89u`)I@0_{#ySHQTlrSnkmtW zkVWY2ASJyAPLZxNQ9w+zLFDzfO0YY@sceEs><*eDvIIkdCh1fRWg2^2=3O7-wyb z3UijBHwvq%q0kC?gO`m)U#Fl9cLgeO=Mr5NTuOZ$ZUAeS=X4=5r@mCoK}t@iaXZnHWVPkv22eMA;VS>`ev-=*N) znT23K`?6vvZa3I)D#`H7)jsUhu?=qb>c;mtSFu}jJj|K>!BEZYCUep>mTe2}#cj_A zux-J6@LaVI-0UzQs|3`@kW3j+c;pEA>n-6N>GzdhQnAo{*D)p;zb7xA_)+P-{jgZ9 z5%PgJs+!lsE+u)`eDodIWHSnl;yaV7Uyv;oVyt*a z0~@ADz#6S!*k!8&r!tXXM(&F{Y2tjHp?k< zM_YFck*p7HaB6@VRF)8-BC8_U$jH^W^=LB_bjlUx)%n6I*I*(CJjtj|IULl_h25%p z_Bo&!BrlZv& zgA~qwKoyEMpc%em++zL%EO{K38ejT2;Mc|qff5!)6o~UXza2ny8N-8yiMFmE4^K5@$*-}|MxUHymLQR zY7pa|DGEn|8-|JP)^<{{{SaEHG{mU;)BvI4KCB(iPa}+8kRiJ-P-WpLtm!tV0Ye7V zeAh*IL3T3=ig7@@3NmqcT@t!#lLExj1bKaag0$W$1}3uJP#MZnv7*iFE4kTtz`Yc_ za!G}5{(i8re=o^lVu+hm8@&B<9lXI=M*0oMNS;9#Avp&@vFCJ}mCc7mypoV|$9}R- ziVrp=cY{A(o*-GrKUcoVc+7SkzrqA<5Qa|^`QSb~F(MNzNUH9wf;E+>B|EzEs$ z9IkX3CY`NH$fF_`4Sa4VM-^Y-M_Gk9Jxz{o(9#9r)h5)@${8m!&1kv?L>1>Ph*z^M z%`lAyT3t1;EL#?St$+11hx77ddWxg@i>FsD+{uA#wbqXT+Y`PhSg! zG@@yoN;Zxf66bC>5Q+}xMUxiqWXgG608*Oxkkxt*)afI`J^0819gJ5*k=;A#i-S2R zez7|DWsCzo;pRXNFJK7wRv|bs8CSL>-3C>=1ew6pjpWn$2K;k(8#Bm01tSU~>{01e z_;DVK4=mV0PR>1v-M)n5m^bxcmoTC_(w#>TsFJU9@}8 zSFpW%GcTk47M-T@2rhW|CyLgZM&!yJXlWsjmh9WfTX80r4wgjGdbJyf@53bClA$=> zrm<4=dus)h96Jo}>+goQEHc?YZ)HLurF^ETPm_N7m`ZMZ%m*^{g|OyiFZ+0gJbB?4 zO@4KoNAH*V5Xm$n(zEpt40u*Uige6q`m8W$FgFHx#M^?1-E?E68ZuOBizJSM=yoHVJRK zj4$;2;-t(Sp6ZAnI4=hX*N0&@Okhr`CS9oMCy0BwD^6iVGodu;xR~~Q==larfPyI+ot{KTv zRi&w}J3;I;OR9O>0;}6SLatBDP~AEovQF2Ps*>|y=lL7Z-c$!&Io*S} zhbb*^4MEW-zoM~bO*$&fB{%9O5v^yzB(9GSc%@|!uVs2{O{FecvoIZwF20HHIu;Rq z;RWDptrC2*G7L8LXrS^LzVMOrBG@08O3EB+VXCe<8l42q> zy&0WhB7svf@1x*ri;$vSD0y$Pmg)zzf~46OX4GMN59Vc ziPu%dP=CFt)Mk+fvi)?Ja*Jm0K7BPqo!5;a3ekqf^Q@3zT{O~At#M8684~sCR%&|;`3Bc{gM4>cs=0ix&@%M z220R`^bG3w;2PR<%8DEGIEHSYc91w5IuduMZ2Weg%n5^`cy`SH%(P2c!dwfbHN+>P1}T^d5k$-B8ZF0Kc-h#q;KCPNRv@D@f29Rg%dK zhhdKj$cAPu+UT?a2FXN&nNPLBh^aQSaPQfQ>%BG%=Z1(uc)~OG<%$(7zeBvC^>1Fx z^}zm$k4|?h{mOOOndhFc{2_{Lmk);(_-z?eYZ=YjISJsUf(w|94i1L;l6;0g3g27F zh`N?>TQ`y4h0owG;hQK;#9!#Mi>7WO6n71vJd{pNWLENE zc?OSPG>B_zEMauXxrytzMy+K7Q#*|JNC4jee=)%1pRp0 s_&X?9cmnk8?D0>~k4*g?lqER<`o^2BmEbp@F2E7sw2k-VPnl@^A7FV>-T(jq diff --git a/examples/aneurysm/data/net4_params/bias_0_0.npz b/examples/aneurysm/data/net4_params/bias_0_0.npz deleted file mode 100644 index 9ab6f005808ba1ab742d685945a8752855a5a591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;2?Sz7v`7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl^|lG+NZVPqHVU0?mo8%;dY!%B6hK%Q}?}GEwk@6-)lRm{MU9Gp1S+4 zKH}c5ux*i@$GtOq^WU)A-;!srKU;r#pM~CveVp$Z_baF{><>T*h@AA~FQ@@wI9LP1 zY8&6av&Y%(I2ph0ez8c`wofW}-~0*Xw$@8KZDrIx?~UBN(DtY`!(OGW3bsdfIoW+n z3g0*9Zlc|pHuZg(UsvvN-oOYH1+r~xtQ_=IPu0bw*)1LD91yM4bq z-`QT(nXq>=6W_jPl45oX_UqUM^Tyh}T5GwlWJ`qYnlsP$_U&`GJJ}><=Qwlb-ucs( z?D_cm=brY3<~EW$CH93a3*Yy;VeQ`8f+>4Z10wsA5NiuC-GeYBYZ$`<0we?iFq)#Q zVMuAtP~fsSaAJ3WHzSh>Gp?KsaW9B$U<8rSe2%UOH5Y&sLO=r}Cs12bJUCCFYeG#i sFfAaPgqT2@!088F6Kd!pYm#OLX#$6JfHx}}NQwmruK?*AKq&?W0EogRB>(^b diff --git a/examples/aneurysm/data/net4_params/bias_epoch_0.npz b/examples/aneurysm/data/net4_params/bias_epoch_0.npz deleted file mode 100644 index 9ab6f005808ba1ab742d685945a8752855a5a591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;2?Sz7v`7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxl^|lG+NZVPqHVU0?mo8%;dY!%B6hK%Q}?}GEwk@6-)lRm{MU9Gp1S+4 zKH}c5ux*i@$GtOq^WU)A-;!srKU;r#pM~CveVp$Z_baF{><>T*h@AA~FQ@@wI9LP1 zY8&6av&Y%(I2ph0ez8c`wofW}-~0*Xw$@8KZDrIx?~UBN(DtY`!(OGW3bsdfIoW+n z3g0*9Zlc|pHuZg(UsvvN-oOYH1+r~xtQ_=IPu0bw*)1LD91yM4bq z-`QT(nXq>=6W_jPl45oX_UqUM^Tyh}T5GwlWJ`qYnlsP$_U&`GJJ}><=Qwlb-ucs( z?D_cm=brY3<~EW$CH93a3*Yy;VeQ`8f+>4Z10wsA5NiuC-GeYBYZ$`<0we?iFq)#Q zVMuAtP~fsSaAJ3WHzSh>Gp?KsaW9B$U<8rSe2%UOH5Y&sLO=r}Cs12bJUCCFYeG#i sFfAaPgqT2@!088F6Kd!pYm#OLX#$6JfHx}}NQwmruK?*AKq&?W0EogRB>(^b diff --git a/examples/aneurysm/data/net4_params/bias_grad_0_0.npz b/examples/aneurysm/data/net4_params/bias_grad_0_0.npz deleted file mode 100644 index bb703f07480a7e5dd073c6b0c6ada77fa05db9a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;1Xt{mml7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0Yukywxlgu&n?G zi>*|L{2mUsC$^R8*Z0`GZnk;QR=r23_ud{M*{OR`1LAbW$u87@FdD1@!F6@xZU@QM zy$XLGTdz_q+H-H|ls&>17;SW{+HGa?@7TPZbJXTgn7>tCnv~7F+DSI96>@v^T0ZVs za=zWh>KcRHve!(zcdXpCN5NFZE^2eZF4Taq-B$Uv1(@zZ7?L%NVF3XW0s$CJQPwb| zG-oJqiS0YKFTk6TNrV|!&W5-bL^d#jNN7Gs*Myo2KnfwCfsqraEh!$HC(t#arWlwO qkWE5NAWh)(gRTiRbdfblGlMjN!#cp5l?^1t0)$t9^bMdC0|NkY!XeH8 diff --git a/examples/aneurysm/data/net4_params/bias_grad_0_1.npz b/examples/aneurysm/data/net4_params/bias_grad_0_1.npz deleted file mode 100644 index 78100834d1207c8ffe9460e5fcf0831638b5abb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1218 zcmWIWW@Zs#fB;1X8-`V}7l0fPW@iv#NQyVm%PXj4WDo!gfs}!yKwz?8sBb_dBSRTO zwR%cwadMHmm4doWnu)rOf_hqhQAtr^UVMI0N-9X)EitD!6)0YukywxlvqR{ zE8e>+=YjR5;^aMl?#irRR8#k6Jn>P!&_6m95 z-_yZVU?V2~!dBz;-(6Nq_wC_P5Vm{pu6h@0K(rr~kZ1v>dk}_X4P#h9fP_E*MpKkE z3@ObS3S15Ux9$t@W@Hj!#+9=n?gfzzj35%4&(SrZ<^qsH2xwsB1Zqo)2j>ZNO{ggb srUhh^5EDofIQ^h&LJeJHP14LDP2jK&@MdKLNwEOo6(D^BD8;}408R diff --git a/examples/aneurysm/data/net4_params/weight_0_0.npz b/examples/aneurysm/data/net4_params/weight_0_0.npz deleted file mode 100644 index c0c66eb626c8a361ffbfac13b14edcf1eb539613..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4494 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 WIXevd>eJ-}a)O30JvnMajsF2&lVh;} diff --git a/examples/pipe/data/net_params/bias_p_epoch_1.npz b/examples/pipe/data/net_params/bias_p_epoch_1.npz deleted file mode 100644 index 80b2f64392c76c0b8fde8c8009655e7fb4608270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1578 zcmd6nYfMu~6vuCQ33XSA79XpNSH)CK)msbMXgi080WppBLVN+Sw9o>#0fwoy1I2&=vIm z4e6F*2fSTeN2WB^VN>}=Na;DOdBhw5*1H3r6El4{{H3y$=h9_+`FuipecpGA2!5%5{>k2Xd!49M>)!5r| z6nr=LVa8({ysk(B65fQpb%{9j4Up`{84#VFC~SXx1f-YZ!5p;=S0!1{a^g64)V?G8 zYyKi$B~Pwxssvqu2@JmBgxMEQ?AMZ!4G~~Ysq0Co0Lt%GfFDywq4{_&zW&#R`l}px z@Ae80*IBWXX&1WRm7r~JCr_m;R=Yd2*t3lS)gcYCt~e-tBLnSd7j{mvK)m9nuqba2 z{%y=eMdUf+ESnF$=6aOsm%`ja6IADX6s%n;=!{ZBYeBt`I%F5LM<-zJl?v3*srYc@ zEZlu>H6(O(3o@)BM~^HQIDQ4hMnsYmY4v!vdo?Dvxnaa7zaV)v4s&j6aAip|oH5@L zY#*A*&xXx|1gP`;vOZLR+25-G_C5z1igSgZR>eV^!h`=brX#D45uSCI;Dys$(J=wk z^!p3^*|7%9cpHWO+EeN~KeXU-`B36asK)ng>A=?B(KxkP;2*h5Glt;_>WpwepACMs zir9;`W9G}tgjr)1`s{LO9k+<+is!(>7yDu2^-A>n+~+!)%h9(X2lUBH(F-2l#PyJQ zoEsc5fAE(<2Tu#fL*B_!bhl5&=Uf$(#e0Cdzl~p!rpMXUf5NYMjS%_+TJ9MdssjEZ z_I?XeeGx!RiScFrRtr*olLOJxH0H*6Rx1gUg@4UK`_C(mj-YM+=cj|A&|g0gstjNS u`9TjD428bbflyeu2nFBmU?}u<2STn05enWltBs5jOA&!~J20n2imT7O8^_oH diff --git a/examples/pipe/data/net_params/bias_u_epoch_1.npz b/examples/pipe/data/net_params/bias_u_epoch_1.npz deleted file mode 100644 index 3db12fdb50f2a3a3985f76d5bb3cc4c7f96ff27e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1578 zcmd6nYfO_@7{}kXl&MU{q%~$S;YBco30k}Wfu08tg5W#gB^yTZf-M(~qINHX$z`#% zpoo$}N#>Q6>y(QX@DfaV9!S(i6THQHL?vS(TQc3y4=R~#ealEF$-d|ppObS=&hwmK za&rFX{CQ61pULqdht$uv4rt)rNnJwNsPMGj1+#IgehW5 zRXMo@*@7yHRcZ2;t3p^+-Y(%gLAx_+mynYy<`cE~1-Z_A!B(w4*SQV~3t?BNgG1OK z*!PWDnLDmi#iwm_)e{r^n*N-o8}{K}3l8As&jalPFMgzdENaG6^EVQC!hR_FClSnF zSW$6v6ApDB!@fVaV835^H1iZRrZsbMx!)CHxYdER-i4SkFCOC`n=xD(3io0X(YO61 z4Er>J;eLhPyHF2?^Uv*vI(FkPB>@<;H;4|E=vRn{cIZpETv()+Th|?J9u}*gM5J*0u;r_&+H>{OHM%7(nkA+uoI-{^)kSSP#A4d;Ygd%VP+yz+ru?kRjydKrTWi;{`khN+9Rqv1x@CrohMj!0Y zmqY#4DsT++)5@zcbVv|L&5%G$oE5vmhwV144p`!$>22DJNdfuvw`Ug8!-|Xg_G@yCtr|=9L?v&eP&i(b}>Vl@?|0DU0Z`W{?rBrKy#z zCml#xT6Sw?Md>`|MF%B9u|=s^Dg|X|bl7F>yB4@YU-C=OFf+{a%nye7&-_&i7grH8 z8e*m^YE$fT9>Z|mjS(^G#NfbG({>&sbfma#T#1Vk<=U011Rk@E*&)&D(lusDI4gFjI&5GgAQ4v?}t*?$d>_$&Ky$aWTX z7x@Bn_+_}DP=xY>bBX8Aa)?=wiP_&h;Y5)S&i?L&pLQAHLr^}o^aW9&(t>ABwvoEN z88|4aj4aNmLH8CTHN9GeXKv)vtIzYHVnB_(?=sL=_Kj*D&O+I+5R>Om19`VQ#H~I> zrhi@Nq>uxKCzDo#YxCea1F)F6T65d$`V-HS^eN8$6IJgjUk z!4B_s(mXsJ<2-Aqc=B|-Ez;9PC4h?`SZSwWh?KoP4=ZBlL0_vCwa-RqUd1cYV{2^4 zeVPjcoA;r2Neb4q<-*YyOQE(pm1L;}=+k->uC$9WNU;%3`l;mFmU4)nd5jDSqKK=- zip~Pq$~8&O0)+mr0^9{HAO8qSd?#Ljy8_RcBJB%Y(Szs-&jc z>oh#30IwTnVO+;e;#U_2-j@%cu|F1+ElQ~Is)pCrENbb_!{LY=ywe_tmlFZZf>vl9@EaabfP0E2%PP!B)6e{dP_-*nSS z!O?Iny9}BdFQVMXKt!j1km|CN(Bo^1+_g#}n8cM_?d`FBmJ7JmFE=08BLDyZ diff --git a/examples/pipe/data/net_params/weight_p_epoch_1.npz b/examples/pipe/data/net_params/weight_p_epoch_1.npz deleted file mode 100644 index a89900d912480e7210e60b7fc9bc2530c2ab1456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21974 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 M8^W?%{O!}f0pv4=S^xk5 diff --git a/examples/pipe/data/net_params/weight_u_epoch_1.npz b/examples/pipe/data/net_params/weight_u_epoch_1.npz deleted file mode 100644 index 31809079a511d242b8fb316aa0f18a19fbeac38b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21974 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 import ppsci + >>> model1 = ppsci.arch.MLP(("x",), ("u",), 5, 20) + >>> opt1 = ppsci.optimizer.Adam(1e-3)((model1,)) + >>> model2 = ppsci.arch.MLP(("y",), ("v",), 5, 20) + >>> opt2 = ppsci.optimizer.Adam(1e-3)((model2,)) + >>> opt = ppsci.optimizer.OptimizerList((opt1, opt2)) + """ + + def __init__(self, optimizer_list: Tuple[optim.Optimizer, ...]): + super().__init__() + self._opt_list = optimizer_list + if "LBFGS" in set(misc.typename(opt) for opt in optimizer_list): + raise ValueError(f"LBFGS is not supported in OptimizerList yet.") + + def step(self): + for opt in self._opt_list: + opt.step() + + def clear_grad(self): + for opt in self._opt_list: + opt.clear_grad() + + def get_lr(self) -> float: + """Return learning rate of first optimizer""" + return self._opt_list[0].get_lr() + + def set_state_dict(self, state_dicts: List[Dict[str, "paddle.Tensor"]]): + for i, opt in enumerate(self._opt_list): + opt.set_state_dict(state_dicts[i]) + + def state_dict(self) -> List[Dict[str, "paddle.Tensor"]]: + state_dicts = [opt.state_dict() for opt in self._opt_list] + return state_dicts + + def __len__(self) -> int: + return len(self._opt_list) + + def __getitem__(self, idx): + return self._opt_list[idx] + + def __setitem__(self, idx, opt): + raise NotImplementedError(f"Can not modify any item in OptimizerList.") diff --git a/ppsci/solver/train.py b/ppsci/solver/train.py index 0279fbf94..e97292e22 100644 --- a/ppsci/solver/train.py +++ b/ppsci/solver/train.py @@ -83,17 +83,18 @@ def train_epoch_func(solver, epoch_id: int, log_freq: int): total_loss.backward() # import numpy as np # # import os - # bias_u = np.load("./data/net2_params" + f"/bias_{epoch_id - 1}_{iter_id - 1}.npz") - # bias_v = np.load("./data/net3_params" + f"/bias_{epoch_id - 1}_{iter_id - 1}.npz") - # bias_p = np.load("./data/net4_params" + f"/bias_{epoch_id - 1}_{iter_id - 1}.npz") - # weight_u = np.load("./data/net2_params" + f"/weight_{epoch_id - 1}_{iter_id - 1}.npz") - # weight_v = np.load("./data/net3_params" + f"/weight_{epoch_id - 1}_{iter_id - 1}.npz") - # weight_p = np.load("./data/net4_params" + f"/weight_{epoch_id - 1}_{iter_id - 1}.npz") - - # weight_grad_u = np.load("./data/net2_params" + f"/weight_grad_{epoch_id - 1}_{iter_id - 1}.npz") - # weight_grad_v = np.load("./data/net3_params" + f"/weight_grad_{epoch_id - 1}_{iter_id - 1}.npz") - # weight_grad_p = np.load("./data/net4_params" + f"/weight_grad_{epoch_id - 1}_{iter_id - 1}.npz") + # path = "/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526" + # bias_u = np.load(path + "/net2_params" + f"/bias_{epoch_id - 1}_{iter_id}.npz") + # bias_v = np.load(path + "/net3_params" + f"/bias_{epoch_id - 1}_{iter_id}.npz") + # bias_p = np.load(path + "/net4_params" + f"/bias_{epoch_id - 1}_{iter_id}.npz") + # weight_u = np.load(path + "/net2_params" + f"/weight_{epoch_id - 1}_{iter_id}.npz") + # weight_v = np.load(path + "/net3_params" + f"/weight_{epoch_id - 1}_{iter_id}.npz") + # weight_p = np.load(path + "/net4_params" + f"/weight_{epoch_id - 1}_{iter_id}.npz") + # weight_grad_u = np.load(path + "/net2_params" + f"/weight_grad_{epoch_id - 1}_{iter_id}.npz") + # weight_grad_v = np.load(path + "/net3_params" + f"/weight_grad_{epoch_id - 1}_{iter_id}.npz") + # weight_grad_p = np.load(path + "/net4_params" + f"/weight_grad_{epoch_id - 1}_{iter_id}.npz") # # u + # print("----------- print [u] net parameters -----------") # print("w0_u is close:", np.allclose(solver.model.model_list[0].linears[0].weight.numpy(), weight_u[f"w_0"])) # print("w1_u is close:", np.allclose(solver.model.model_list[0].linears[1].weight.numpy(), weight_u[f"w_1"])) # print("w2_u is close:", np.allclose(solver.model.model_list[0].linears[2].weight.numpy(), weight_u[f"w_2"])) @@ -110,6 +111,7 @@ def train_epoch_func(solver, epoch_id: int, log_freq: int): # print("w3_u grad is close:", np.allclose(solver.model.model_list[0].last_fc.weight.grad.numpy(), weight_grad_u[f"w_3"])) # #v + # print("----------- print [v] net parameters -----------") # print("w0_v is close:", np.allclose(solver.model.model_list[1].linears[0].weight.numpy(), weight_v[f"w_0"])) # print("w1_v is close:", np.allclose(solver.model.model_list[1].linears[1].weight.numpy(), weight_v[f"w_1"])) # print("w2_v is close:", np.allclose(solver.model.model_list[1].linears[2].weight.numpy(), weight_v[f"w_2"])) @@ -126,6 +128,7 @@ def train_epoch_func(solver, epoch_id: int, log_freq: int): # print("w3_v grad is close:", np.allclose(solver.model.model_list[1].last_fc.weight.grad.numpy(), weight_grad_v[f"w_3"])) # #p + # print("----------- print [p] net parameters -----------") # print("w0_p is close:", np.allclose(solver.model.model_list[2].linears[0].weight.numpy(), weight_p[f"w_0"])) # print("w1_p is close:", np.allclose(solver.model.model_list[2].linears[1].weight.numpy(), weight_p[f"w_1"])) # print("w2_p is close:", np.allclose(solver.model.model_list[2].linears[2].weight.numpy(), weight_p[f"w_2"])) diff --git a/ppsci/utils/initializer.py b/ppsci/utils/initializer.py index ebb58e0fe..ec07032b1 100644 --- a/ppsci/utils/initializer.py +++ b/ppsci/utils/initializer.py @@ -427,6 +427,14 @@ def kaiming_normal_( fan = _calculate_correct_fan(tensor, mode, reverse) gain = _calculate_gain(nonlinearity, a) std = gain / math.sqrt(fan) + # print("------------------------------------------") + # print(f"layer 1 mean : {np.mean(tensor.numpy())}") + # print(f"layer 1 var : {np.var(tensor.numpy())}") + # print("\n") + # tmp = _no_grad_normal_(tensor, 0, std) + # print(f"layer 1 mean : {np.mean(tmp.numpy())}") + # print(f"layer 1 var : {np.var(tmp.numpy())}") + # print("\n") return _no_grad_normal_(tensor, 0, std) From 9aa1279496c1ace86f1244df188dbc9d7194b776 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Wed, 31 May 2023 12:23:06 +0000 Subject: [PATCH 11/31] need shuffle --- examples/aneurysm/aneurysm_flow.py | 37 +++++++++++++++--------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index fb20c0415..0dd763c5e 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -51,7 +51,7 @@ def predict( core.set_prim_eager_enabled(True) # Hyper parameters - EPOCHS = 1 + EPOCHS = 500 BATCH_SIZE = 50 LEARNING_RATE = 1e-3 @@ -100,28 +100,27 @@ def predict( plt.scatter(x[idx], y_up[idx]) plt.scatter(x[idx], y_down[idx]) plt.axis("equal") - plt.show() plt.savefig(osp.join(PLOT_DIR, "idealized_stenotid_vessel"), bbox_inches="tight") # Points and shuffle(for alignment) - y = np.zeros([len(x), 1]) + y = np.zeros([len(x), 1], dtype=paddle.get_default_dtype()) for x0 in x_inital: index = np.where(x[:, 0] == x0)[0] - Rsec = max(y_up[index]) # y is linear to scale, so we place linespace to get 1000 x, it coressponds to vessels - y[index] = np.linspace(-Rsec, Rsec, len(index)).reshape(len(index), -1) + y[index] = np.linspace(-max(y_up[index]), max(y_up[index]), len(index)).reshape( + len(index), -1 + ) idx = np.where(scale == 0) # plot vessel which scale is 0.2 by finding its indexs plt.figure() plt.scatter(x[idx], y[idx]) plt.axis("equal") - plt.show() plt.savefig(osp.join(PLOT_DIR, "one_scale_sample"), bbox_inches="tight") # index = [i for i in range(x.shape[0])] # res = list(zip(x, y, scale)) # np.random.shuffle(res) - # x, y, scale = zip(*res) + # x, y, scale = zip(*res)fastype # x = np.array(x).astype(float) # y = np.array(y).astype(float) # scale = np.array(scale).astype(float) @@ -161,10 +160,10 @@ def init_func(m): False, False, np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net2_params/weight_0_0.npz" + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net2_params/weight_0_0.npz" ), np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net2_params/bias_0_0.npz" + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net2_params/bias_0_0.npz" ), ) @@ -177,10 +176,10 @@ def init_func(m): False, False, np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net3_params/weight_0_0.npz" + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net3_params/weight_0_0.npz" ), np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net3_params/bias_0_0.npz" + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net3_params/bias_0_0.npz" ), ) @@ -193,10 +192,10 @@ def init_func(m): False, False, np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net4_params/weight_0_0.npz" + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net4_params/weight_0_0.npz" ), np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526/net4_params/bias_0_0.npz" + f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net4_params/bias_0_0.npz" ), ) # model_1.apply(init_func) @@ -282,7 +281,7 @@ def __call__(self, out, input): "iters_per_epoch": int(x.shape[0] / BATCH_SIZE), "sampler": { "name": "BatchSampler", - "shuffle": False, + "shuffle": True, "drop_last": False, }, }, @@ -302,12 +301,12 @@ def __call__(self, out, input): iters_per_epoch=int(x.shape[0] / BATCH_SIZE), eval_during_train=False, save_freq=10, - log_freq=1, + log_freq=100, equation=equation, - # checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0504_debug/checkpoints/epoch_300" + checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0531/checkpoints/epoch_30", ) - solver.train() + # solver.train() def single_test(x, y, scale, solver): xt = paddle.to_tensor(x, dtype="float32") @@ -331,11 +330,11 @@ def single_test(x, y, scale, solver): for caseIdx in caseCount: scale = scale_test[int(caseIdx - 1)] Data_CFD = np.load(path + str(caseIdx) + "CFD_contour.npz") - Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") + # Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") x = Data_CFD["x"] y = Data_CFD["y"] U_CFD = Data_CFD["U"] - U = Data_NN["U"] + # U = Data_NN["U"] n = len(x) output_dict = single_test( x.reshape(n, 1), y.reshape(n, 1), np.ones((n, 1)) * scale, solver From 2cb23a3fc6e7800e2040b366433fdaa173e331cb Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Thu, 1 Jun 2023 06:24:03 +0000 Subject: [PATCH 12/31] refine by review --- examples/aneurysm/aneurysm_flow.py | 138 ++++++++++++----------------- 1 file changed, 56 insertions(+), 82 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 0dd763c5e..225ebee6b 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -43,7 +43,7 @@ def predict( os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") # set output directory - OUTPUT_DIR = "./output_0531" + OUTPUT_DIR = "./output_0601" PLOT_DIR = osp.join(OUTPUT_DIR, "visu") os.makedirs(PLOT_DIR, exist_ok=True) # initialize logger @@ -151,56 +151,14 @@ def init_func(m): if misc.typename(m) == "Linear": ppsci.utils.initializer.kaiming_normal_(m.weight, reverse=True) - model_1 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["u"], - 3, - 20, - "swish", - False, - False, - np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net2_params/weight_0_0.npz" - ), - np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net2_params/bias_0_0.npz" - ), - ) + model_1 = ppsci.arch.MLP(("x", "y", "scale"), ("u"), 3, 20, "swish") - model_2 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["v"], - 3, - 20, - "swish", - False, - False, - np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net3_params/weight_0_0.npz" - ), - np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net3_params/bias_0_0.npz" - ), - ) + model_2 = ppsci.arch.MLP(("x", "y", "scale"), ("v"), 3, 20, "swish") - model_3 = ppsci.arch.MLP( - ["x", "y", "scale"], - ["p"], - 3, - 20, - "swish", - False, - False, - np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net4_params/weight_0_0.npz" - ), - np.load( - f"/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/net_params/net4_params/bias_0_0.npz" - ), - ) - # model_1.apply(init_func) - # model_2.apply(init_func) - # model_3.apply(init_func) + model_3 = ppsci.arch.MLP(("x", "y", "scale"), ("p"), 3, 20, "swish") + model_1.apply(init_func) + model_2.apply(init_func) + model_3.apply(init_func) # print(f"layer 1 mean : {np.mean(model_1.linears[0].weight.numpy())}") # print(f"layer 1 var : {np.var(model_1.linears[0].weight.numpy())}") @@ -247,7 +205,7 @@ def __call__(self, out, input): + (X_IN - x) * (X_OUT - x) * p ) else: - raise NotImplementedError(f"{out.keys()} are outputs to be implemented") + ValueError(f"{next(iter(out.keys()))} is not a valid key.") return new_out @@ -255,17 +213,17 @@ def __call__(self, out, input): model_1.register_output_transform(shared_transform) model_2.register_output_transform(shared_transform) model_3.register_output_transform(shared_transform) - model = ppsci.arch.ModelList([model_1, model_2, model_3]) + model = ppsci.arch.ModelList((model_1, model_2, model_3)) optimizer_1 = ppsci.optimizer.Adam( - LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 - )([model_1]) + LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=1e-15 + )((model_1,)) optimizer_2 = ppsci.optimizer.Adam( - LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 - )([model_2]) + LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=1e-15 + )((model_2,)) optimizer_3 = ppsci.optimizer.Adam( - LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=10**-15 - )([model_3]) + LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=1e-15 + )((model_3,)) optimizer = ppsci.optimizer.OptimizerList((optimizer_1, optimizer_2, optimizer_3)) equation = {"NavierStokes": ppsci.equation.NavierStokes(NU, RHO, 2, False)} @@ -287,14 +245,13 @@ def __call__(self, out, input): }, loss=ppsci.loss.MSELoss("mean"), evenly=True, - weight_dict={"u": 1, "v": 1, "p": 1}, name="EQ", ) - + constrain_dict = {pde_constraint.name: pde_constraint} # initialize solver solver = ppsci.solver.Solver( model, - {pde_constraint.name: pde_constraint}, + constrain_dict, OUTPUT_DIR, optimizer, epochs=EPOCHS, @@ -303,14 +260,14 @@ def __call__(self, out, input): save_freq=10, log_freq=100, equation=equation, - checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0531/checkpoints/epoch_30", + # checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0601/checkpoints/epoch_460", ) - # solver.train() + solver.train() def single_test(x, y, scale, solver): - xt = paddle.to_tensor(x, dtype="float32") - yt = paddle.to_tensor(y, dtype="float32") + xt = paddle.to_tensor(x) + yt = paddle.to_tensor(y) scalet = scale * paddle.ones_like(xt) net_in = {"x": xt, "y": yt, "scale": scalet} output_dict = solver.predict(net_in, 10000) @@ -327,31 +284,48 @@ def single_test(x, y, scale, solver): fontsize = 14 axis_limit = [0, 1, -0.15, 0.15] path = "./data/cases/" + dp = 0.1 for caseIdx in caseCount: scale = scale_test[int(caseIdx - 1)] - Data_CFD = np.load(path + str(caseIdx) + "CFD_contour.npz") - # Data_NN = np.load(path + str(caseIdx) + "NN_contour.npz") - x = Data_CFD["x"] - y = Data_CFD["y"] - U_CFD = Data_CFD["U"] - # U = Data_NN["U"] + data_CFD = np.load(osp.join(path, str(caseIdx) + "CFD_contour.npz")) + x = data_CFD["x"].astype(paddle.get_default_dtype()) + y = data_CFD["y"].astype(paddle.get_default_dtype()) + u_cfd = data_CFD["U"].astype(paddle.get_default_dtype()) + # p_cfd = data_CFD["P"].astype(paddle.get_default_dtype()) # missing data + n = len(x) output_dict = single_test( - x.reshape(n, 1), y.reshape(n, 1), np.ones((n, 1)) * scale, solver + x.reshape(n, 1), + y.reshape(n, 1), + np.ones((n, 1), dtype=paddle.get_default_dtype()) * scale, + solver, ) u, v, p = output_dict["u"], output_dict["v"], output_dict["p"] w = np.zeros_like(u) - U = np.concatenate([u, v, w], axis=1) + u_vec = np.concatenate([u, v, w], axis=1) + print(f"shape of vec : {(u_vec[:, 0] - u_cfd[:, 0]).shape}") + error_u = np.linalg.norm(u_vec[:, 0] - u_cfd[:, 0], ord=2) / ( + dp * len(u_vec[:, 0]) + ) + error_v = np.linalg.norm(u_vec[:, 1] - u_cfd[:, 1], ord=2) / ( + dp * len(u_vec[:, 0]) + ) + # error_p = np.linalg.norm(p - p_cfd) / (dp * dp) + + print(f"Table 1 : Aneurysm - Geometry error u : {error_u: .3e}") + print(f"Table 1 : Aneurysm - Geometry error v : {error_v: .3e}") + # print(f"Table 1 : Aneurysm - Geometry error p : {error_p}") + exit() # Streamwise velocity component u plt.figure() plt.subplot(212) - plt.scatter(x, y, c=U[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.scatter(x, y, c=u_vec[:, 0], vmin=min(u_cfd[:, 0]), vmax=max(u_cfd[:, 0])) plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) plt.axis(axis_limit) plt.colorbar() plt.subplot(211) - plt.scatter(x, y, c=U_CFD[:, 0], vmin=min(U_CFD[:, 0]), vmax=max(U_CFD[:, 0])) + plt.scatter(x, y, c=u_cfd[:, 0], vmin=min(u_cfd[:, 0]), vmax=max(u_cfd[:, 0])) plt.colorbar() plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) plt.axis(axis_limit) @@ -363,12 +337,12 @@ def single_test(x, y, scale, solver): # Spanwise velocity component v plt.figure() plt.subplot(212) - plt.scatter(x, y, c=U[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.scatter(x, y, c=u_vec[:, 1], vmin=min(u_cfd[:, 1]), vmax=max(u_cfd[:, 1])) plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) plt.axis(axis_limit) plt.colorbar() plt.subplot(211) - plt.scatter(x, y, c=U_CFD[:, 1], vmin=min(U_CFD[:, 1]), vmax=max(U_CFD[:, 1])) + plt.scatter(x, y, c=u_cfd[:, 1], vmin=min(u_cfd[:, 1]), vmax=max(u_cfd[:, 1])) plt.colorbar() plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) plt.axis(axis_limit) @@ -379,11 +353,11 @@ def single_test(x, y, scale, solver): plt.close("all") # Centerline wall shear profile tau_c - Data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") - x_inital = Data_CFD_wss["x"] - wall_shear_mag_up = Data_CFD_wss["wss"] - Data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") - NNwall_shear_mag_up = Data_NN_wss["wss"] + data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") + x_inital = data_CFD_wss["x"] + wall_shear_mag_up = data_CFD_wss["wss"] + data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") + nn_wall_shear_mag_up = data_NN_wss["wss"] plt.figure() plt.plot( @@ -397,7 +371,7 @@ def single_test(x, y, scale, solver): ) plt.plot( x_inital, - NNwall_shear_mag_up, + nn_wall_shear_mag_up, label="DNN", color="red", linestyle="--", From 5fc66e360565aaeced9c501874bcd8022e41f725 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 07:35:57 +0000 Subject: [PATCH 13/31] add wss formula --- examples/aneurysm/aneurysm_flow.py | 149 ++++++++++++----------------- 1 file changed, 60 insertions(+), 89 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 225ebee6b..0a6e2c8a9 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -1,4 +1,5 @@ import math +import os import os.path as osp import matplotlib.pyplot as plt @@ -9,39 +10,10 @@ import ppsci from ppsci.utils import misc - -def generate_scale_for_all_x(x, scale): - new_scale = np.tile(scale, (len(x), 1)) - new_x = np.array([np.tile(val, len(scale)) for val in x]).reshape(len(new_scale), 1) - return new_x, new_scale - - -def predict( - input_dict, - solver, -): - for key, val in input_dict.items(): - input_dict[key] = paddle.to_tensor(val, dtype="float32") - evaluator = ppsci.utils.expression.ExpressionSolver( - input_dict.keys(), ["u", "v", "p"], solver.model - ) - output_expr_dict = { - "u": lambda d: d["u"], - "v": lambda d: d["v"], - "p": lambda d: d["p"], - } - for output_key, output_expr in output_expr_dict.items(): - evaluator.add_target_expr(output_expr, output_key) - output_dict = evaluator(input_dict) - return output_dict - - if __name__ == "__main__": # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) - import os - os.chdir("/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm") # set output directory OUTPUT_DIR = "./output_0601" PLOT_DIR = osp.join(OUTPUT_DIR, "visu") @@ -68,11 +40,10 @@ def predict( R_INLET = 0.05 unique_x = np.linspace(X_IN, X_OUT, 100) mu = 0.5 * (X_OUT - X_IN) - N_y = 20 + N_Y = 20 x_inital = np.linspace(X_IN, X_OUT, 100, dtype=paddle.get_default_dtype()).reshape( 100, 1 ) - mu = 0.5 * (X_OUT - X_IN) x_20_copy = np.tile(x_inital, (20, 1)) # duplicate 20 times of x for dataloader SIGMA = 0.1 SCALE_START = -0.02 @@ -80,9 +51,10 @@ def predict( scale_initial = np.linspace( SCALE_START, SCALE_END, 50, endpoint=True, dtype=paddle.get_default_dtype() ).reshape(50, 1) - x, scale = generate_scale_for_all_x( - x_20_copy, scale_initial - ) # generate 50 scale factors for each x (mesh grid) + scale = np.tile(scale_initial, (len(x_20_copy), 1)) + x = np.array([np.tile(val, len(scale_initial)) for val in x_20_copy]).reshape( + len(scale), 1 + ) # Axisymetric boundary R = ( @@ -117,14 +89,6 @@ def predict( plt.axis("equal") plt.savefig(osp.join(PLOT_DIR, "one_scale_sample"), bbox_inches="tight") - # index = [i for i in range(x.shape[0])] - # res = list(zip(x, y, scale)) - # np.random.shuffle(res) - # x, y, scale = zip(*res)fastype - # x = np.array(x).astype(float) - # y = np.array(y).astype(float) - # scale = np.array(scale).astype(float) - np.savez("x_0526_pd", x=x) np.savez("y_0526_pd", y=y) np.savez("scale_0526_pd", scale=scale) @@ -133,28 +97,12 @@ def predict( coord_keys=["x", "y", "scale"], ) - def _calculate_fan_in_and_fan_out(tensor): - if tensor.ndim < 2: - raise ValueError( - f"tensor.ndim should be no less than 2, but got {tensor.ndim}." - ) - num_input_fmaps = tensor.shape[1] - num_output_fmaps = tensor.shape[0] - receptive_field_size = 1 - if tensor.ndim > 2: - receptive_field_size = np.prod(tensor.shape[2:]) - fan_in = num_input_fmaps * receptive_field_size - fan_out = num_output_fmaps * receptive_field_size - return fan_in, fan_out - def init_func(m): if misc.typename(m) == "Linear": ppsci.utils.initializer.kaiming_normal_(m.weight, reverse=True) model_1 = ppsci.arch.MLP(("x", "y", "scale"), ("u"), 3, 20, "swish") - model_2 = ppsci.arch.MLP(("x", "y", "scale"), ("v"), 3, 20, "swish") - model_3 = ppsci.arch.MLP(("x", "y", "scale"), ("p"), 3, 20, "swish") model_1.apply(init_func) model_2.apply(init_func) @@ -239,7 +187,7 @@ def __call__(self, out, input): "iters_per_epoch": int(x.shape[0] / BATCH_SIZE), "sampler": { "name": "BatchSampler", - "shuffle": True, + "shuffle": False, "drop_last": False, }, }, @@ -258,9 +206,8 @@ def __call__(self, out, input): iters_per_epoch=int(x.shape[0] / BATCH_SIZE), eval_during_train=False, save_freq=10, - log_freq=100, + log_freq=1, equation=equation, - # checkpoint_path="/workspace/wangguan/PaddleScience_Surrogate/examples/aneurysm/output_0601/checkpoints/epoch_460", ) solver.train() @@ -270,22 +217,29 @@ def single_test(x, y, scale, solver): yt = paddle.to_tensor(y) scalet = scale * paddle.ones_like(xt) net_in = {"x": xt, "y": yt, "scale": scalet} - output_dict = solver.predict(net_in, 10000) + output_dict = solver.predict(net_in, 100) return output_dict scale_test = np.load("./data/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ "scale" ] - caseCount = [1.0, 151.0, 486.0] - W_ctl = np.zeros([len(scale_test), 1]) - W_ctl_Ml = np.zeros([len(scale_test), 1]) - plot_x = 0.8 - plot_y = 0.06 - fontsize = 14 + CASE_COUNT = [1.0, 151.0, 486.0] + w_ctl = np.zeros([len(scale_test), 1]) + w_ctl_Ml = np.zeros([len(scale_test), 1]) + PLOT_X = 0.8 + PLOT_Y = 0.06 + FONTSIZE = 14 axis_limit = [0, 1, -0.15, 0.15] path = "./data/cases/" - dp = 0.1 - for caseIdx in caseCount: + D_P = 0.1 + error_u = [] + error_v = [] + N_CL = 200 # number of sampling points in centerline (confused about centerline, but the paper did not explain) + x_centerline = np.linspace( + X_IN, X_OUT, N_CL, dtype=paddle.get_default_dtype() + ).reshape(N_CL, 1) + y_centerline = np.zeros_like(x_centerline, dtype=paddle.get_default_dtype()) + for caseIdx in CASE_COUNT: scale = scale_test[int(caseIdx - 1)] data_CFD = np.load(osp.join(path, str(caseIdx) + "CFD_contour.npz")) x = data_CFD["x"].astype(paddle.get_default_dtype()) @@ -303,31 +257,25 @@ def single_test(x, y, scale, solver): u, v, p = output_dict["u"], output_dict["v"], output_dict["p"] w = np.zeros_like(u) u_vec = np.concatenate([u, v, w], axis=1) - print(f"shape of vec : {(u_vec[:, 0] - u_cfd[:, 0]).shape}") - error_u = np.linalg.norm(u_vec[:, 0] - u_cfd[:, 0], ord=2) / ( - dp * len(u_vec[:, 0]) + error_u.append( + np.linalg.norm(u_vec[:, 0] - u_cfd[:, 0]) / (D_P * len(u_vec[:, 0])) ) - error_v = np.linalg.norm(u_vec[:, 1] - u_cfd[:, 1], ord=2) / ( - dp * len(u_vec[:, 0]) + error_v.append( + np.linalg.norm(u_vec[:, 1] - u_cfd[:, 1]) / (D_P * len(u_vec[:, 0])) ) - # error_p = np.linalg.norm(p - p_cfd) / (dp * dp) - - print(f"Table 1 : Aneurysm - Geometry error u : {error_u: .3e}") - print(f"Table 1 : Aneurysm - Geometry error v : {error_v: .3e}") - # print(f"Table 1 : Aneurysm - Geometry error p : {error_p}") - exit() + # error_p = np.linalg.norm(p - p_cfd) / (D_P * D_P) # Streamwise velocity component u plt.figure() plt.subplot(212) plt.scatter(x, y, c=u_vec[:, 0], vmin=min(u_cfd[:, 0]), vmax=max(u_cfd[:, 0])) - plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.text(PLOT_X, PLOT_Y, r"DNN", {"color": "b", "fontsize": FONTSIZE}) plt.axis(axis_limit) plt.colorbar() plt.subplot(211) plt.scatter(x, y, c=u_cfd[:, 0], vmin=min(u_cfd[:, 0]), vmax=max(u_cfd[:, 0])) plt.colorbar() - plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.text(PLOT_X, PLOT_Y, r"CFD", {"color": "b", "fontsize": FONTSIZE}) plt.axis(axis_limit) plt.savefig( osp.join(PLOT_DIR, f"{int(caseIdx)}_scale_{scale}_uContour_test.png"), @@ -338,13 +286,13 @@ def single_test(x, y, scale, solver): plt.figure() plt.subplot(212) plt.scatter(x, y, c=u_vec[:, 1], vmin=min(u_cfd[:, 1]), vmax=max(u_cfd[:, 1])) - plt.text(plot_x, plot_y, r"DNN", {"color": "b", "fontsize": fontsize}) + plt.text(PLOT_X, PLOT_Y, r"DNN", {"color": "b", "fontsize": FONTSIZE}) plt.axis(axis_limit) plt.colorbar() plt.subplot(211) plt.scatter(x, y, c=u_cfd[:, 1], vmin=min(u_cfd[:, 1]), vmax=max(u_cfd[:, 1])) plt.colorbar() - plt.text(plot_x, plot_y, r"CFD", {"color": "b", "fontsize": fontsize}) + plt.text(PLOT_X, PLOT_Y, r"CFD", {"color": "b", "fontsize": FONTSIZE}) plt.axis(axis_limit) plt.savefig( osp.join(PLOT_DIR, f"{int(caseIdx)}_scale_{scale}_vContour_test.png"), @@ -352,12 +300,32 @@ def single_test(x, y, scale, solver): ) plt.close("all") - # Centerline wall shear profile tau_c + # Centerline wall shear profile tau_c (downside) data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") x_inital = data_CFD_wss["x"] wall_shear_mag_up = data_CFD_wss["wss"] - data_NN_wss = np.load(path + str(caseIdx) + "NN_wss.npz") - nn_wall_shear_mag_up = data_NN_wss["wss"] + + D_H = 0.001 # The spanwise distance is approximately the height of the wall + r_cl = ( + scale + * 1 + / np.sqrt(2 * np.pi * SIGMA**2) + * np.exp(-((x_centerline - mu) ** 2) / (2 * SIGMA**2)) + ) + y_wall = (-R_INLET + D_H) * np.ones_like( + x_centerline, dtype=paddle.get_default_dtype() + ) + r_cl + output_dict_wss = single_test( + x_centerline, y_wall, np.ones((N_CL, 1)) * scale, solver + ) + v_cl_total = np.zeros_like( + x_centerline, dtype=paddle.get_default_dtype() + ) # assuming normal velocity along the wall is zero + u_cl = output_dict_wss["u"].numpy() + v_cl = output_dict_wss["v"].numpy() + for i in range(N_CL): + v_cl_total[i] = np.sqrt(u_cl[i] ** 2 + v_cl[i] ** 2) + tau_c = NU * v_cl_total / D_H plt.figure() plt.plot( @@ -371,7 +339,7 @@ def single_test(x, y, scale, solver): ) plt.plot( x_inital, - nn_wall_shear_mag_up, + tau_c, label="DNN", color="red", linestyle="--", @@ -387,3 +355,6 @@ def single_test(x, y, scale, solver): bbox_inches="tight", ) plt.close("all") + print(f"epochs = {EPOCHS}") + print(f"Table 1 : Aneurysm - Geometry error u : {sum(error_u) / len(error_u): .3e}") + print(f"Table 1 : Aneurysm - Geometry error v : {sum(error_v) / len(error_v): .3e}") From 50d6936f4903c5089db2fca064210d03e1160074 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 08:08:53 +0000 Subject: [PATCH 14/31] review fix --- examples/aneurysm/aneurysm_flow.py | 12 +- examples/pipe/poiseuille_flow.py | 8 +- ppsci/arch/activation.py | 11 +- ppsci/arch/mlp.py | 33 +---- ppsci/data/dataset/__init__.py | 2 - ppsci/data/dataset/array_dataset.py | 25 ---- ppsci/solver/printer.py | 2 +- ppsci/solver/solver.py | 8 +- ppsci/solver/train.py | 201 ++++++++++++---------------- ppsci/utils/initializer.py | 8 -- 10 files changed, 112 insertions(+), 198 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 0a6e2c8a9..1153a6688 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -101,9 +101,15 @@ def init_func(m): if misc.typename(m) == "Linear": ppsci.utils.initializer.kaiming_normal_(m.weight, reverse=True) - model_1 = ppsci.arch.MLP(("x", "y", "scale"), ("u"), 3, 20, "swish") - model_2 = ppsci.arch.MLP(("x", "y", "scale"), ("v"), 3, 20, "swish") - model_3 = ppsci.arch.MLP(("x", "y", "scale"), ("p"), 3, 20, "swish") + model_1 = ppsci.arch.MLP( + ("x", "y", "scale"), ("u"), 3, 20, "silu" + ) # swish without learnable variable + model_2 = ppsci.arch.MLP( + ("x", "y", "scale"), ("v"), 3, 20, "silu" + ) # swish without learnable variable + model_3 = ppsci.arch.MLP( + ("x", "y", "scale"), ("p"), 3, 20, "silu" + ) # swish without learnable variable model_1.apply(init_func) model_2.apply(init_func) model_3.apply(init_func) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 332d8a0f4..ae3b04b85 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -210,7 +210,7 @@ def predict( ["u"], LAYER_NUMBER, HIDDEN_SIZE, - "swish_beta", + "swish", False, False, ) @@ -220,7 +220,7 @@ def predict( ["v"], LAYER_NUMBER, HIDDEN_SIZE, - "swish_beta", + "swish", False, False, ) @@ -230,11 +230,9 @@ def predict( ["p"], LAYER_NUMBER, HIDDEN_SIZE, - "swish_beta", + "swish", False, False, - # np.load(dir + f"/weight_p_epoch_1.npz"), - # np.load(dir + f"/bias_p_epoch_1.npz"), ) def output_transform(out, input): diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index ef259c818..9ca442872 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -19,20 +19,19 @@ from paddle import nn -class Swish_beta(nn.Layer): +class Swish(nn.Layer): def __init__(self, beta: float = 1.0): super().__init__() self.beta = paddle.create_parameter( - shape=[1], - dtype="float32", + shape=[0], default_initializer=paddle.nn.initializer.Constant(beta), ) def forward(self, x): - return x * F.sigmoid(x * self.beta) + return x * F.sigmoid(self.beta * x) -class Swish(nn.Layer): +class Silu(nn.Layer): def __init__(self): super().__init__() @@ -46,7 +45,7 @@ def forward(self, x): "selu": F.selu, "gelu": F.gelu, "sigmoid": F.sigmoid, - "silu": F.silu, + "silu": Silu, "sin": paddle.sin, "cos": paddle.cos, "swish_beta": Swish_beta(1.0), diff --git a/ppsci/arch/mlp.py b/ppsci/arch/mlp.py index c543cd648..fae52b51c 100644 --- a/ppsci/arch/mlp.py +++ b/ppsci/arch/mlp.py @@ -16,7 +16,6 @@ from typing import Tuple from typing import Union -import paddle from paddle import nn from ppsci.arch import activation as act_mod @@ -51,9 +50,6 @@ def __init__( activation: str = "tanh", skip_connection: bool = False, weight_norm: bool = False, - weight_init=None, - bias_init=None, - net_special_name: str = None, input_dim: Optional[int] = None, ): super().__init__() @@ -79,35 +75,14 @@ def __init__( # initialize FC layer(s) cur_size = len(self.input_keys) if input_dim is None else input_dim - for i, _size in enumerate(hidden_size): - if weight_init is not None: - w_para = paddle.nn.initializer.Assign(weight_init[f"w_{i}"]) - b_para = paddle.nn.initializer.Assign(bias_init[f"b_{i}"]) - self.linears.append( - nn.Linear( - cur_size, - _size, - weight_attr=paddle.ParamAttr(initializer=w_para), - bias_attr=paddle.ParamAttr(initializer=b_para), - ) - ) - else: - self.linears.append(nn.Linear(cur_size, _size)) + for _size in hidden_size: + self.linears.append(nn.Linear(cur_size, _size)) if weight_norm: self.linears[-1] = nn.utils.weight_norm(self.linears[-1], dim=1) cur_size = _size self.linears = nn.LayerList(self.linears) - if weight_init is not None: - w_para = paddle.nn.initializer.Assign(weight_init[f"w_{num_layers}"]) - b_para = paddle.nn.initializer.Assign(bias_init[f"b_{num_layers}"]) - self.last_fc = nn.Linear( - cur_size, - len(self.output_keys), - weight_attr=paddle.ParamAttr(initializer=w_para), - bias_attr=paddle.ParamAttr(initializer=b_para), - ) - else: - self.last_fc = nn.Linear(cur_size, len(self.output_keys)) + + self.last_fc = nn.Linear(cur_size, len(self.output_keys)) # initialize activation function self.act = act_mod.get_activation(activation) diff --git a/ppsci/data/dataset/__init__.py b/ppsci/data/dataset/__init__.py index 0e890fb34..3d4d7f533 100644 --- a/ppsci/data/dataset/__init__.py +++ b/ppsci/data/dataset/__init__.py @@ -15,7 +15,6 @@ import copy from ppsci.data.dataset.array_dataset import IterableNamedArrayDataset -from ppsci.data.dataset.array_dataset import MiniBatchDataset from ppsci.data.dataset.array_dataset import NamedArrayDataset from ppsci.data.dataset.csv_dataset import CSVDataset from ppsci.data.dataset.csv_dataset import IterableCSVDataset @@ -33,7 +32,6 @@ __all__ = [ "IterableNamedArrayDataset", "NamedArrayDataset", - "MiniBatchDataset", "CSVDataset", "IterableCSVDataset", "ERA5Dataset", diff --git a/ppsci/data/dataset/array_dataset.py b/ppsci/data/dataset/array_dataset.py index c22bb2068..427265256 100644 --- a/ppsci/data/dataset/array_dataset.py +++ b/ppsci/data/dataset/array_dataset.py @@ -108,28 +108,3 @@ def __iter__(self): def __len__(self): return 1 - - -class MiniBatchDataset(io.Dataset): - def __init__(self, input, label, weight): - super().__init__() - self.input = input - self.label = label - self.num_samples = self.check_input(input) - - def check_input(self, input): - len_input = set() - for _, value in input.items(): - len_input.add(len(value)) - if len(len_input) is not 1: - raise AttributeError("Input dimension mismatch") - else: - return list(len_input)[0] - - def __getitem__(self, idx): - input_item = {key: value[idx] for key, value in self.input.items()} - label_item = {key: value[idx] for key, value in self.label.items()} - return (input_item, label_item) - - def __len__(self): - return self.num_samples diff --git a/ppsci/solver/printer.py b/ppsci/solver/printer.py index d8a8a9d9f..5bd383908 100644 --- a/ppsci/solver/printer.py +++ b/ppsci/solver/printer.py @@ -43,7 +43,7 @@ def log_train_info(trainer, batch_size, epoch_id, iter_id): metric_msg = ", ".join( [ - f"{key}: {trainer.train_output_info[key].val:.9f}" + f"{key}: {trainer.train_output_info[key].avg:.5f}" for key in trainer.train_output_info ] ) diff --git a/ppsci/solver/solver.py b/ppsci/solver/solver.py index c4683a6eb..31496524e 100644 --- a/ppsci/solver/solver.py +++ b/ppsci/solver/solver.py @@ -343,14 +343,15 @@ def train(self): """Training""" self.global_step = self.best_metric["epoch"] * self.iters_per_epoch + 1 + LOSS = [] for epoch_id in range(self.best_metric["epoch"] + 1, self.epochs + 1): - self.train_epoch_func(self, epoch_id, self.log_freq) + self.train_epoch_func(self, epoch_id, self.log_freq, LOSS) # log training summation at end of a epoch metric_msg = ", ".join( [self.train_output_info[key].avg_info for key in self.train_output_info] ) - # logger.info(f"[Train][Epoch {epoch_id}/{self.epochs}][Avg] {metric_msg}") + logger.info(f"[Train][Epoch {epoch_id}/{self.epochs}][Avg] {metric_msg}") self.train_output_info.clear() cur_metric = float("inf") @@ -409,6 +410,9 @@ def train(self): self.equation, ) + import numpy as np + + np.savetxt("Loss_track_pipe_para.csv", np.array(LOSS)) # close VisualDL if self.vdl_writer is not None: self.vdl_writer.close() diff --git a/ppsci/solver/train.py b/ppsci/solver/train.py index e97292e22..16deae148 100644 --- a/ppsci/solver/train.py +++ b/ppsci/solver/train.py @@ -13,14 +13,19 @@ # limitations under the License. import time +from typing import TYPE_CHECKING + +from paddle.distributed.fleet.utils import hybrid_parallel_util as hpu from ppsci.solver import printer -from ppsci.utils import expression from ppsci.utils import misc from ppsci.utils import profiler +if TYPE_CHECKING: + from ppsci import solver + -def train_epoch_func(solver, epoch_id: int, log_freq: int): +def train_epoch_func(solver: "solver.Solver", epoch_id: int, log_freq: int): """Train program for one epoch Args: @@ -38,9 +43,12 @@ def train_epoch_func(solver, epoch_id: int, log_freq: int): reader_cost = 0 batch_cost = 0 reader_tic = time.perf_counter() + + input_dicts = [] + label_dicts = [] + weight_dicts = [] for _, _constraint in solver.constraint.items(): input_dict, label_dict, weight_dict = next(_constraint.data_iter) - # profile code below # profiler.add_profiler_step(solver.cfg["profiler_options"]) if iter_id == 5: @@ -48,105 +56,58 @@ def train_epoch_func(solver, epoch_id: int, log_freq: int): for key in solver.train_time_info: solver.train_time_info[key].reset() reader_cost += time.perf_counter() - reader_tic - total_batch_size += next(iter(input_dict.values())).shape[0] - for v in input_dict.values(): v.stop_gradient = False - evaluator = expression.ExpressionSolver( - _constraint.input_keys, _constraint.output_keys, solver.model - ) - for output_name, output_formula in _constraint.output_expr.items(): - if output_name in label_dict: - evaluator.add_target_expr(output_formula, output_name) - - # forward for every constraint - with solver.autocast_context_manager(): - output_dict = evaluator(input_dict) - constraint_loss = _constraint.loss(output_dict, label_dict, weight_dict) - total_loss += constraint_loss - - loss_dict[_constraint.name] = float(constraint_loss) + # gather each constraint's input, label, weight to a list + input_dicts.append(input_dict) + label_dicts.append(label_dict) + weight_dicts.append(weight_dict) + total_batch_size += next(iter(input_dict.values())).shape[0] reader_tic = time.perf_counter() - if solver.update_freq > 1: - total_loss = total_loss / solver.update_freq - loss_dict["loss"] = float(total_loss) - # backward - if solver.use_amp: - total_loss_scaled = solver.scaler.scale(total_loss) - total_loss_scaled.backward() - if iter_id % solver.update_freq == 0: + with solver.no_sync_context_manager(solver.world_size > 1, solver.model): + # forward for every constraint, including model and equation expression + with solver.autocast_context_manager(solver.use_amp, solver.amp_level): + constraint_losses = solver.forward_helper.train_forward( + [ + _constraint.output_expr + for _constraint in solver.constraint.values() + ], + input_dicts, + solver.model, + solver.constraint, + label_dicts, + weight_dicts, + ) + # accumulate all losses + for i, _constraint in enumerate(solver.constraint.values()): + total_loss += constraint_losses[i] + loss_dict[_constraint.name] += ( + float(constraint_losses[i]) / solver.update_freq + ) + if solver.update_freq > 1: + total_loss = total_loss / solver.update_freq + loss_dict["loss"] = float(total_loss) + + # backward + if solver.use_amp: + total_loss_scaled = solver.scaler.scale(total_loss) + total_loss_scaled.backward() + else: + total_loss.backward() + + # update parameters + if iter_id % solver.update_freq == 0 or iter_id == solver.iters_per_epoch: + if solver.world_size > 1: + # fuse + allreduce manually before optimization if use DDP + no_sync + # details in https://github.com/PaddlePaddle/Paddle/issues/48898#issuecomment-1343838622 + hpu.fused_allreduce_gradients(list(solver.model.parameters()), None) + if solver.use_amp: solver.scaler.minimize(solver.optimizer, total_loss_scaled) - solver.optimizer.clear_grad() - else: - total_loss.backward() - # import numpy as np - # # import os - # path = "/workspace/wangguan/LabelFree-DNN-Surrogate/ParametricAneurysm/Cases_0526" - # bias_u = np.load(path + "/net2_params" + f"/bias_{epoch_id - 1}_{iter_id}.npz") - # bias_v = np.load(path + "/net3_params" + f"/bias_{epoch_id - 1}_{iter_id}.npz") - # bias_p = np.load(path + "/net4_params" + f"/bias_{epoch_id - 1}_{iter_id}.npz") - # weight_u = np.load(path + "/net2_params" + f"/weight_{epoch_id - 1}_{iter_id}.npz") - # weight_v = np.load(path + "/net3_params" + f"/weight_{epoch_id - 1}_{iter_id}.npz") - # weight_p = np.load(path + "/net4_params" + f"/weight_{epoch_id - 1}_{iter_id}.npz") - # weight_grad_u = np.load(path + "/net2_params" + f"/weight_grad_{epoch_id - 1}_{iter_id}.npz") - # weight_grad_v = np.load(path + "/net3_params" + f"/weight_grad_{epoch_id - 1}_{iter_id}.npz") - # weight_grad_p = np.load(path + "/net4_params" + f"/weight_grad_{epoch_id - 1}_{iter_id}.npz") - # # u - # print("----------- print [u] net parameters -----------") - # print("w0_u is close:", np.allclose(solver.model.model_list[0].linears[0].weight.numpy(), weight_u[f"w_0"])) - # print("w1_u is close:", np.allclose(solver.model.model_list[0].linears[1].weight.numpy(), weight_u[f"w_1"])) - # print("w2_u is close:", np.allclose(solver.model.model_list[0].linears[2].weight.numpy(), weight_u[f"w_2"])) - # print("w3_u is close:", np.allclose(solver.model.model_list[0].last_fc.weight.numpy(), weight_u[f"w_3"])) - - # print("b0_u is close:", np.allclose(solver.model.model_list[0].linears[0].bias.numpy(), bias_u[f"b_0"])) - # print("b1_u is close:", np.allclose(solver.model.model_list[0].linears[1].bias.numpy(), bias_u[f"b_1"])) - # print("b2_u is close:", np.allclose(solver.model.model_list[0].linears[2].bias.numpy(), bias_u[f"b_2"])) - # print("b3_u is close:", np.allclose(solver.model.model_list[0].last_fc.bias.numpy(), bias_u[f"b_3"])) - - # print("w0_u grad is close:", np.allclose(solver.model.model_list[0].linears[0].weight.grad.numpy(), weight_grad_u[f"w_0"])) - # print("w1_u grad is close:", np.allclose(solver.model.model_list[0].linears[1].weight.grad.numpy(), weight_grad_u[f"w_1"])) - # print("w2_u grad is close:", np.allclose(solver.model.model_list[0].linears[2].weight.grad.numpy(), weight_grad_u[f"w_2"])) - # print("w3_u grad is close:", np.allclose(solver.model.model_list[0].last_fc.weight.grad.numpy(), weight_grad_u[f"w_3"])) - - # #v - # print("----------- print [v] net parameters -----------") - # print("w0_v is close:", np.allclose(solver.model.model_list[1].linears[0].weight.numpy(), weight_v[f"w_0"])) - # print("w1_v is close:", np.allclose(solver.model.model_list[1].linears[1].weight.numpy(), weight_v[f"w_1"])) - # print("w2_v is close:", np.allclose(solver.model.model_list[1].linears[2].weight.numpy(), weight_v[f"w_2"])) - # print("w3_v is close:", np.allclose(solver.model.model_list[1].last_fc.weight.numpy(), weight_v[f"w_3"])) - - # print("b0_v is close:", np.allclose(solver.model.model_list[1].linears[0].bias.numpy(), bias_v[f"b_0"])) - # print("b1_v is close:", np.allclose(solver.model.model_list[1].linears[1].bias.numpy(), bias_v[f"b_1"])) - # print("b2_v is close:", np.allclose(solver.model.model_list[1].linears[2].bias.numpy(), bias_v[f"b_2"])) - # print("b3_v is close:", np.allclose(solver.model.model_list[1].last_fc.bias.numpy(), bias_v[f"b_3"])) - - # print("w0_v grad is close:", np.allclose(solver.model.model_list[1].linears[0].weight.grad.numpy(), weight_grad_v[f"w_0"])) - # print("w1_v grad is close:", np.allclose(solver.model.model_list[1].linears[1].weight.grad.numpy(), weight_grad_v[f"w_1"])) - # print("w2_v grad is close:", np.allclose(solver.model.model_list[1].linears[2].weight.grad.numpy(), weight_grad_v[f"w_2"])) - # print("w3_v grad is close:", np.allclose(solver.model.model_list[1].last_fc.weight.grad.numpy(), weight_grad_v[f"w_3"])) - - # #p - # print("----------- print [p] net parameters -----------") - # print("w0_p is close:", np.allclose(solver.model.model_list[2].linears[0].weight.numpy(), weight_p[f"w_0"])) - # print("w1_p is close:", np.allclose(solver.model.model_list[2].linears[1].weight.numpy(), weight_p[f"w_1"])) - # print("w2_p is close:", np.allclose(solver.model.model_list[2].linears[2].weight.numpy(), weight_p[f"w_2"])) - # print("w3_p is close:", np.allclose(solver.model.model_list[2].last_fc.weight.numpy(), weight_p[f"w_3"])) - - # print("b0_p is close:", np.allclose(solver.model.model_list[2].linears[0].bias.numpy(), bias_p[f"b_0"])) - # print("b1_p is close:", np.allclose(solver.model.model_list[2].linears[1].bias.numpy(), bias_p[f"b_1"])) - # print("b2_p is close:", np.allclose(solver.model.model_list[2].linears[2].bias.numpy(), bias_p[f"b_2"])) - # print("b3_p is close:", np.allclose(solver.model.model_list[2].last_fc.bias.numpy(), bias_p[f"b_3"])) - - # print("w0_p grad is close:", np.allclose(solver.model.model_list[2].linears[0].weight.grad.numpy(), weight_grad_p[f"w_0"])) - # print("w1_p grad is close:", np.allclose(solver.model.model_list[2].linears[1].weight.grad.numpy(), weight_grad_p[f"w_1"])) - # print("w2_p grad is close:", np.allclose(solver.model.model_list[2].linears[2].weight.grad.numpy(), weight_grad_p[f"w_2"])) - # print("w3_p grad is close:", np.allclose(solver.model.model_list[2].last_fc.weight.grad.numpy(), weight_grad_p[f"w_3"])) - - if iter_id % solver.update_freq == 0: + else: solver.optimizer.step() - solver.optimizer.clear_grad() + solver.optimizer.clear_grad() # update learning rate by step if solver.lr_scheduler is not None and not solver.lr_scheduler.by_epoch: @@ -162,12 +123,10 @@ def train_epoch_func(solver, epoch_id: int, log_freq: int): if iter_id == 1 or iter_id % log_freq == 0: printer.log_train_info(solver, total_batch_size, epoch_id, iter_id) - # real_loss = float(loss_dict["loss"]) - # print(f"{(epoch_id - 1) * 195 + iter_id} step: loss is {real_loss}") batch_tic = time.perf_counter() -def train_LBFGS_epoch_func(solver, epoch_id: int, log_freq: int): +def train_LBFGS_epoch_func(solver: "solver.Solver", epoch_id: int, log_freq: int): """Train function for one epoch with L-BFGS optimizer. Args: @@ -208,30 +167,38 @@ def closure(): Tensor: Computed loss. """ total_loss = 0 - for i, _constraint in enumerate(solver.constraint.values()): - evaluator = expression.ExpressionSolver( - _constraint.input_keys, _constraint.output_keys, solver.model - ) - for output_name, output_formula in _constraint.output_expr.items(): - if output_name in label_dict: - evaluator.add_target_expr(output_formula, output_name) - - # forward for every batched data dict - with solver.autocast_context_manager(): - output_dict_i = evaluator(input_dicts[i]) - constraint_loss = _constraint.loss( - output_dict_i, label_dicts[i], weight_dicts[i] + with solver.no_sync_context_manager(solver.world_size > 1, solver.model): + with solver.autocast_context_manager(solver.use_amp, solver.amp_level): + # forward for every constraint, including model and equation expression + constraint_losses = solver.forward_helper.train_forward( + [ + _constraint.output_expr + for _constraint in solver.constraint.values() + ], + input_dicts, + solver.model, + solver.constraint, + label_dicts, + weight_dicts, ) - total_loss += constraint_loss + # accumulate all losses + for i, _constraint in enumerate(solver.constraint.values()): + total_loss += constraint_losses[i] + loss_dict[_constraint.name] = float(constraint_losses[i]) + loss_dict["loss"] = float(total_loss) - loss_dict[_constraint.name] = float(constraint_loss) + # backward + solver.optimizer.clear_grad() + total_loss.backward() - solver.optimizer.clear_grad() - total_loss.backward() - loss_dict["loss"] = float(total_loss) + if solver.world_size > 1: + # fuse + allreduce manually before optimization if use DDP model + # details in https://github.com/PaddlePaddle/Paddle/issues/48898#issuecomment-1343838622 + hpu.fused_allreduce_gradients(list(solver.model.parameters()), None) return total_loss + # update parameters solver.optimizer.step(closure) # update learning rate by step @@ -245,7 +212,7 @@ def closure(): solver.train_time_info["reader_cost"].update(reader_cost) solver.train_time_info["batch_cost"].update(batch_cost) printer.update_train_loss(solver, loss_dict, total_batch_size) - if iter_id == 1 and iter_id % log_freq == 0: + if iter_id == 1 or iter_id % log_freq == 0: printer.log_train_info(solver, total_batch_size, epoch_id, iter_id) batch_tic = time.perf_counter() diff --git a/ppsci/utils/initializer.py b/ppsci/utils/initializer.py index ec07032b1..ebb58e0fe 100644 --- a/ppsci/utils/initializer.py +++ b/ppsci/utils/initializer.py @@ -427,14 +427,6 @@ def kaiming_normal_( fan = _calculate_correct_fan(tensor, mode, reverse) gain = _calculate_gain(nonlinearity, a) std = gain / math.sqrt(fan) - # print("------------------------------------------") - # print(f"layer 1 mean : {np.mean(tensor.numpy())}") - # print(f"layer 1 var : {np.var(tensor.numpy())}") - # print("\n") - # tmp = _no_grad_normal_(tensor, 0, std) - # print(f"layer 1 mean : {np.mean(tmp.numpy())}") - # print(f"layer 1 var : {np.var(tmp.numpy())}") - # print("\n") return _no_grad_normal_(tensor, 0, std) From 67f064a80823135c5863f29b153bd48503cec9f2 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 08:11:06 +0000 Subject: [PATCH 15/31] delete useless comment --- ppsci/solver/solver.py | 275 +++++++++++++++++++++++++++-------------- 1 file changed, 184 insertions(+), 91 deletions(-) diff --git a/ppsci/solver/solver.py b/ppsci/solver/solver.py index 31496524e..03db5c21a 100644 --- a/ppsci/solver/solver.py +++ b/ppsci/solver/solver.py @@ -15,10 +15,11 @@ from __future__ import annotations import contextlib -import copy +import itertools import os import sys from typing import Any +from typing import Callable from typing import Dict from typing import Optional from typing import Union @@ -37,6 +38,7 @@ import ppsci from ppsci.utils import config +from ppsci.utils import expression from ppsci.utils import logger from ppsci.utils import misc from ppsci.utils import save_load @@ -48,7 +50,7 @@ class Solver: Args: model (nn.Layer): Model. constraint (Optional[Dict[str, ppsci.constraint.Constraint]]): Constraint(s) applied on model. Defaults to None. - output_dir (str, optional): Output directory. Defaults to "./output/". + output_dir (Optional[str]): Output directory. Defaults to "./output/". optimizer (Optional[optimizer.Optimizer]): Optimizer object. Defaults to None. lr_scheduler (Optional[optimizer.lr.LRScheduler]): Learning rate scheduler. Defaults to None. epochs (int, optional): Training epoch(s). Defaults to 5. @@ -73,6 +75,7 @@ class Solver: compute_metric_by_batch (bool, optional): Whether calculate metrics after each batch during evaluate. Defaults to False. eval_with_no_grad (bool, optional): Whether set `stop_gradient=True` for every Tensor if no differentiation involved during computation, generally for save GPU memory and accelerate computing. Defaults to False. + to_static (bool, optional): Whether enable to_static for forward pass. Defaults to False. Examples: >>> import ppsci @@ -97,14 +100,14 @@ class Solver: ... "./output", ... opt, ... None, - ... ) + ... ) # doctest: +SKIP """ def __init__( self, model: nn.Layer, constraint: Optional[Dict[str, ppsci.constraint.Constraint]] = None, - output_dir: str = "./output/", + output_dir: Optional[str] = "./output/", optimizer: Optional[optim.Optimizer] = None, lr_scheduler: Optional[optim.lr.LRScheduler] = None, epochs: int = 5, @@ -128,6 +131,7 @@ def __init__( checkpoint_path: Optional[str] = None, compute_metric_by_batch: bool = False, eval_with_no_grad: bool = False, + to_static: bool = False, ): # set model self.model = model @@ -200,6 +204,16 @@ def __init__( # whether calculate metrics after each batch during evaluate self.compute_metric_by_batch = compute_metric_by_batch + if validator is not None: + for metric in itertools.chain( + *[_v.metric.values() for _v in self.validator.values()] + ): + if metric.keep_batch ^ compute_metric_by_batch: + raise ValueError( + f"{misc.typename(metric)}.keep_batch should be " + f"{compute_metric_by_batch} when compute_metric_by_batch=" + f"{compute_metric_by_batch}." + ) # whether set `stop_gradient=True` for every Tensor if no differentiation involved during computation self.eval_with_no_grad = eval_with_no_grad @@ -216,6 +230,10 @@ def __init__( if isinstance(loaded_metric, dict): self.best_metric.update(loaded_metric) + # init logger without FileHandler if not initialized before + if logger._logger is None: + logger.init_logger("ppsci", None) + # choosing an appropriate training function for different optimizers if isinstance(self.optimizer, optim.LBFGS): self.train_epoch_func = ppsci.solver.train.train_LBFGS_epoch_func @@ -227,7 +245,9 @@ def __init__( # decorate model(s) and optimizer(s) for AMP if self.use_amp: - self.model = amp.decorate(self.model, self.optimizer, self.amp_level) + self.model, self.optimizer = amp.decorate( + self.model, self.optimizer, self.amp_level + ) # wrap model and optimizer to parallel object self.rank = dist.get_rank() @@ -238,6 +258,11 @@ def __init__( self.model = fleet.distributed_model(self.model) if self.optimizer is not None: self.optimizer = fleet.distributed_optimizer(self.optimizer) + logger.warning( + f"Detected world_size({self.world_size}) > 1, it is recommended to " + "scale up the learning rate and reduce the epochs or " + "iters_per_epoch according to the world_size both linearly." + ) self.global_step = 0 @@ -247,8 +272,13 @@ def __init__( if version.Version(paddle.__version__) != version.Version("0.0.0") else f"develop({paddle.version.commit[:7]})" ) - if logger._logger is not None: - logger.info(f"Using paddlepaddle {paddle_version} on device {self.device}") + logger.info(f"Using paddlepaddle {paddle_version} on device {self.device}") + + self.forward_helper = expression.ExpressionSolver() + + # whether enable static for forward pass, default to Fals + jit.enable_to_static(to_static) + logger.info(f"Set to_static={to_static} for forward computation.") @staticmethod def from_config(cfg: Dict[str, Any]) -> Solver: @@ -340,12 +370,11 @@ def from_config(cfg: Dict[str, Any]) -> Solver: ) def train(self): - """Training""" + """Training.""" self.global_step = self.best_metric["epoch"] * self.iters_per_epoch + 1 - LOSS = [] for epoch_id in range(self.best_metric["epoch"] + 1, self.epochs + 1): - self.train_epoch_func(self, epoch_id, self.log_freq, LOSS) + self.train_epoch_func(self, epoch_id, self.log_freq) # log training summation at end of a epoch metric_msg = ", ".join( @@ -380,6 +409,7 @@ def train(self): ) logger.scaler("eval_metric", cur_metric, epoch_id, self.vdl_writer) + # visualize after evaluation if self.visualizer is not None: self.visualize(epoch_id) @@ -399,7 +429,7 @@ def train(self): self.equation, ) - # always save the latest model for convenient resume training + # save the latest model for convenient resume training save_load.save_checkpoint( self.model, self.optimizer, @@ -410,19 +440,20 @@ def train(self): self.equation, ) - import numpy as np - - np.savetxt("Loss_track_pipe_para.csv", np.array(LOSS)) # close VisualDL if self.vdl_writer is not None: self.vdl_writer.close() - def eval(self, epoch_id: int = 0): - """Evaluation""" - train_state = self.model.training - if train_state: - self.model.eval() + @misc.run_on_eval_mode + def eval(self, epoch_id: int = 0) -> float: + """Evaluation. + Args: + epoch_id (int, optional): Epoch id. Defaults to 0. + + Returns: + float: The value of the evaluation, used to judge the quality of the model. + """ # set eval func self.eval_func = ppsci.solver.eval.eval_func @@ -433,123 +464,157 @@ def eval(self, epoch_id: int = 0): logger.info(f"[Eval][Epoch {epoch_id}][Avg] {metric_msg}") self.eval_output_info.clear() - if train_state: - self.model.train() return result + @misc.run_on_eval_mode def visualize(self, epoch_id: int = 0): - """Visualization""" - train_state = self.model.training - if train_state: - self.model.eval() + """Visualization. - # init train func + Args: + epoch_id (int, optional): Epoch id. Defaults to 0. + """ + # set visualize func self.visu_func = ppsci.solver.visu.visualize_func self.visu_func(self, epoch_id) logger.info(f"[Visualize][Epoch {epoch_id}] Finished visualization") - if train_state: - self.model.train() - - @paddle.no_grad() + @misc.run_on_eval_mode def predict( self, input_dict: Dict[str, Union[np.ndarray, paddle.Tensor]], + expr_dict: Optional[Dict[str, Callable]] = None, batch_size: int = 64, + no_grad: bool = True, ) -> Dict[str, paddle.Tensor]: - """Pure prediction using model.forward(...), support single device prediction yet. + """Pure prediction using model.forward(...) and expression(optional, if given). Args: input_dict (Dict[str, Union[np.ndarray, paddle.Tensor]]): Input data in dict. + expr_dict (Optional[Dict[str, Callable]]): Expression dict, which guide to + compute equation variable with callable function. Defaults to None. batch_size (int, optional): Predicting by batch size. Defaults to 64. - + no_grad (bool): Whether set stop_gradient=True for entire prediction, mainly + for memory-efficiency. Defaults to True. Returns: Dict[str, paddle.Tensor]: Prediction in dict. """ - train_state = self.model.training - if train_state: - self.model.eval() - - if self.world_size > 1: - raise NotImplementedError( - "Solver.predict only support single device yet, " - f"but got {self.world_size} devices." - ) - num_samples = len(next(iter(input_dict.values()))) - batch_num = (num_samples + (batch_size - 1)) // batch_size + num_pad = (self.world_size - num_samples % self.world_size) % self.world_size + # pad with last element if `num_samples` is not divisible by `world_size` + # ensuring every device get same number of data. + if num_pad > 0: + for k, v in input_dict.items(): + repeat_times = (num_pad, *(1 for _ in range(v.ndim - 1))) + input_dict[k] = paddle.concat( + ( + v, + paddle.tile(v[num_samples - 1 : num_samples], repeat_times), + ), + ) + + num_samples_pad = num_samples + num_pad + local_num_samples_pad = num_samples_pad // self.world_size + local_input_dict = ( + {k: v[self.rank :: self.world_size] for k, v in input_dict.items()} + if self.world_size > 1 + else input_dict + ) + local_batch_num = (local_num_samples_pad + (batch_size - 1)) // batch_size pred_dict = misc.Prettydefaultdict(list) - for batch_id in range(batch_num): - batch_input_dict = {} - st = batch_id * batch_size - ed = min(num_samples, (batch_id + 1) * batch_size) - - # prepare batch input dict - for key in input_dict: - if not paddle.is_tensor(input_dict[key]): - batch_input_dict[key] = paddle.to_tensor( - input_dict[key][st:ed], paddle.get_default_dtype() + with self.no_grad_context_manager(no_grad), self.no_sync_context_manager( + self.world_size > 1, self.model + ): + for batch_id in range(local_batch_num): + batch_input_dict = {} + st = batch_id * batch_size + ed = min(local_num_samples_pad, (batch_id + 1) * batch_size) + + # prepare batch input dict + for key in local_input_dict: + if not paddle.is_tensor(local_input_dict[key]): + batch_input_dict[key] = paddle.to_tensor( + local_input_dict[key][st:ed], paddle.get_default_dtype() + ) + else: + batch_input_dict[key] = local_input_dict[key][st:ed] + batch_input_dict[key].stop_gradient = no_grad + + # forward + with self.autocast_context_manager(self.use_amp, self.amp_level): + batch_output_dict = self.forward_helper.visu_forward( + expr_dict, batch_input_dict, self.model ) - else: - batch_input_dict[key] = input_dict[key][st:ed] - batch_input_dict[key].stop_gradient = False - # forward - with self.autocast_context_manager(): - batch_output_dict = self.model(batch_input_dict) - - # collect batch data - for key, batch_output in batch_output_dict.items(): - pred_dict[key].append(batch_output) - - pred_dict = {key: paddle.concat(value) for key, value in pred_dict.items()} + # collect batch data + for key, batch_output in batch_output_dict.items(): + pred_dict[key].append(batch_output.detach()) + + # concatenate local predictions + pred_dict = {key: paddle.concat(value) for key, value in pred_dict.items()} + + if self.world_size > 1: + # gather global predictions from all devices if world_size > 1 + pred_dict = { + key: misc.all_gather(value) for key, value in pred_dict.items() + } + + # rearange predictions as the same order of input_dict according to inverse + # permutation, then discard predictions of padding data at the end + perm = np.arange(num_samples_pad, dtype="int64") + perm = np.concatenate( + [perm[rank :: self.world_size] for rank in range(self.world_size)], + axis=0, + ) + perm_inv = np.empty_like(perm) + perm_inv[perm] = np.arange(num_samples_pad, dtype="int64") + perm_inv = paddle.to_tensor(perm_inv) + pred_dict = { + key: value[perm_inv][:num_samples] + for key, value in pred_dict.items() + } - if train_state: - self.model.train() return pred_dict + @misc.run_on_eval_mode def export(self): - """Export to inference model""" - pretrained_path = self.cfg["Global"]["pretrained_model"] - if pretrained_path is not None: - save_load.load_pretrain(self.model, pretrained_path, self.equation) + """Export to inference model.""" + raise NotImplementedError("model export is not supported yet.") - self.model.eval() + def autocast_context_manager( + self, enable: bool, level: Literal["O0", "O1", "O2"] = "O1" + ) -> contextlib.AbstractContextManager: + """Smart autocast context manager for Auto Mix Precision. - input_spec = copy.deepcopy(self.cfg["Export"]["input_shape"]) - config.replace_shape_with_inputspec_(input_spec) - static_model = jit.to_static(self.model, input_spec=input_spec) - - export_dir = self.cfg["Global"]["save_inference_dir"] - save_path = os.path.join(export_dir, "inference") - jit.save(static_model, save_path) - logger.info(f"The inference model has been exported to {export_dir}") - - def autocast_context_manager(self) -> contextlib.AbstractContextManager: - """Autocast context manager for Auto Mix Precision. + Args: + enable (bool): Enable autocast. + level (Literal["O0", "O1", "O2"]): Autocast level. Returns: - Union[contextlib.AbstractContextManager]: Context manager. + contextlib.AbstractContextManager: Smart autocast context manager. """ - if self.use_amp: - ctx_manager = amp.auto_cast(level=self.amp_level) + if enable: + ctx_manager = amp.auto_cast(level=level) else: ctx_manager = ( contextlib.nullcontext() if sys.version_info >= (3, 7) else contextlib.suppress() ) - return ctx_manager - def no_grad_context_manager(self) -> contextlib.AbstractContextManager: - """No grad manager. + def no_grad_context_manager( + self, enable: bool + ) -> contextlib.AbstractContextManager: + """Smart no_grad context manager. + + Args: + enable (bool): Enable no_grad. Returns: - Union[contextlib.AbstractContextManager]: Context manager. + contextlib.AbstractContextManager: Smart no_grad context manager. """ - if self.eval_with_no_grad: + if enable: ctx_manager = paddle.no_grad() else: ctx_manager = ( @@ -557,5 +622,33 @@ def no_grad_context_manager(self) -> contextlib.AbstractContextManager: if sys.version_info >= (3, 7) else contextlib.suppress() ) + return ctx_manager + + def no_sync_context_manager( + self, + enable: bool, + ddp_model: paddle.DataParallel, + ) -> contextlib.AbstractContextManager: + """Smart no_sync context manager for given model. + NOTE: Only `paddle.DataParallel` object has `no_sync` interface. + + Args: + enable (bool): Enable no_sync. + Returns: + contextlib.AbstractContextManager: Smart no_sync context manager. + """ + if enable: + if not isinstance(ddp_model, paddle.DataParallel): + raise TypeError( + "no_sync interface is only for model with type paddle.DataParallel, " + f"but got type {misc.typename(ddp_model)}" + ) + ctx_manager = ddp_model.no_sync() + else: + ctx_manager = ( + contextlib.nullcontext() + if sys.version_info >= (3, 7) + else contextlib.suppress() + ) return ctx_manager From 204c5e574c3b8cacc2808a4afaf2142d19a40457 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 10:05:48 +0000 Subject: [PATCH 16/31] reformat pipe flow --- examples/pipe/poiseuille_flow.py | 144 ++++++++-------------------- ppsci/arch/activation.py | 3 +- ppsci/data/__init__.py | 2 + ppsci/equation/pde/navier_stokes.py | 3 + ppsci/optimizer/optimizer.py | 3 - 5 files changed, 49 insertions(+), 106 deletions(-) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index ae3b04b85..7d0ea9dd9 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -121,32 +121,12 @@ def momentum_z_compute_func(out): self.add_equation("momentum_z", momentum_z_compute_func) -def predict( - input_dict, - solver, -): - for key, val in input_dict.items(): - input_dict[key] = paddle.to_tensor(val, dtype="float32") - evaluator = ppsci.utils.expression.ExpressionSolver( - input_dict.keys(), ["u", "v", "p"], solver.model - ) - output_expr_dict = { - "u": lambda d: d["u"], - "v": lambda d: d["v"], - "p": lambda d: d["p"], - } - for output_key, output_expr in output_expr_dict.items(): - evaluator.add_target_expr(output_expr, output_key) - output_dict = evaluator(input_dict) - return output_dict - - if __name__ == "__main__": # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) # set output directory - output_dir = "./output_poiseuille_flow" + output_dir = "./output_0602" core.set_prim_eager_enabled(True) @@ -170,9 +150,6 @@ def predict( EPOCHS = 3000 # 5000 ITERS_PER_EPOCH = int((N_x * N_y * N_p) / BATCH_SIZE) - HIDDEN_SIZE = 50 - LAYER_NUMBER = 4 - 1 # last fc - LOG_FREQ = 1 EVAL_FREQ = 100 # display step VISU_FREQ = 100 # visulize step @@ -184,9 +161,15 @@ def predict( NU_END = NU_MEAN + NU_MEAN * NU_STD # 0.1 ## prepare data with (?, 2) - data_1d_x = np.linspace(X_IN, X_OUT, N_x, endpoint=True) - data_1d_y = np.linspace(Y_START, Y_END, N_y, endpoint=True) - data_1d_nu = np.linspace(NU_START, NU_END, N_p, endpoint=True) + data_1d_x = np.linspace( + X_IN, X_OUT, N_x, endpoint=True, dtype=paddle.get_default_dtype() + ) + data_1d_y = np.linspace( + Y_START, Y_END, N_y, endpoint=True, dtype=paddle.get_default_dtype() + ) + data_1d_nu = np.linspace( + NU_START, NU_END, N_p, endpoint=True, dtype=paddle.get_default_dtype() + ) data_2d_xy = ( np.array(np.meshgrid(data_1d_x, data_1d_y, data_1d_nu)).reshape(3, -1).T @@ -194,72 +177,22 @@ def predict( data_2d_xy_old = copy.deepcopy(data_2d_xy) np.random.shuffle(data_2d_xy) - input_x = data_2d_xy[:, 0].reshape(data_2d_xy.shape[0], 1).astype("float32") - input_y = data_2d_xy[:, 1].reshape(data_2d_xy.shape[0], 1).astype("float32") - input_nu = data_2d_xy[:, 2].reshape(data_2d_xy.shape[0], 1).astype("float32") + input_x = data_2d_xy[:, 0].reshape(data_2d_xy.shape[0], 1) + input_y = data_2d_xy[:, 1].reshape(data_2d_xy.shape[0], 1) + input_nu = data_2d_xy[:, 2].reshape(data_2d_xy.shape[0], 1) interior_data = {"x": input_x, "y": input_y, "nu": input_nu} interior_geom = ppsci.geometry.PointCloud( interior={"x": input_x, "y": input_y, "nu": input_nu}, - coord_keys=["x", "y", "nu"], + coord_keys=("x", "y", "nu"), ) # set model - model_u = ppsci.arch.MLP( - ["sin(x)", "cos(x)", "y", "nu"], - ["u"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - ) - - model_v = ppsci.arch.MLP( - ["sin(x)", "cos(x)", "y", "nu"], - ["v"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - ) - - model_p = ppsci.arch.MLP( - ["sin(x)", "cos(x)", "y", "nu"], - ["p"], - LAYER_NUMBER, - HIDDEN_SIZE, - "swish", - False, - False, - ) + model_u = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("u"), 3, 50, "swish") - def output_transform(out, input): - new_out = {} - x, y = input["x"], input["y"] - - if next(iter(out.keys())) == "u": - u = out["u"] - # The no-slip condition of velocity on the wall - new_out["u"] = u * (R**2 - y**2) - elif next(iter(out.keys())) == "v": - v = out["v"] - # The no-slip condition of velocity on the wall - new_out["v"] = (R**2 - y**2) * v - elif next(iter(out.keys())) == "p": - p = out["p"] - # The pressure inlet [p_in = 0.1] and outlet [p_out = 0] - new_out["p"] = ( - (X_IN - x) * 0 - + (P_IN - P_OUT) * (X_OUT - x) / L - + 0 * y - + (X_IN - x) * (X_OUT - x) * p - ) - else: - raise NotImplementedError(f"{out.keys()} are outputs to be implemented") + model_v = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("v"), 3, 50, "swish") - return new_out + model_p = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("p"), 3, 50, "swish") def input_transform(input): x, y = input["x"], input["y"] @@ -273,16 +206,33 @@ def input_transform(input): model_u.register_input_transform(input_transform) model_v.register_input_transform(input_transform) model_p.register_input_transform(input_transform) - model_u.register_output_transform(output_transform) - model_v.register_output_transform(output_transform) - model_p.register_output_transform(output_transform) - model = ppsci.arch.ModelList([model_u, model_v, model_p]) + model_u.register_output_transform( + lambda out, input: {"u": out["u"] * (R**2 - input["y"] ** 2)} + ) + model_v.register_output_transform( + lambda out, input: {"v": (R**2 - input["y"] ** 2) * out["v"]} + ) + model_p.register_output_transform( + lambda out, input: { + "p": ( + (X_IN - input["x"]) * 0 + + (P_IN - P_OUT) * (X_OUT - input["x"]) / L + + 0 * input["y"] + + (X_IN - input["x"]) * (X_OUT - input["x"]) * out["p"] + ) + } + ) + model = ppsci.arch.ModelList((model_u, model_v, model_p)) # set optimizer optimizer = ppsci.optimizer.Adam(LEARNING_RATE)([model]) # set euqation - equation = {"NavierStokes": NavierStokes(RHO, 2, False)} + equation = { + "NavierStokes": ppsci.equation.NavierStokes( + nu=lambda out: out["nu"], rho=RHO, dim=2, time=False + ) + } pde_constraint = ppsci.constraint.InteriorConstraint( equation["NavierStokes"].equations, @@ -301,19 +251,9 @@ def input_transform(input): }, loss=ppsci.loss.MSELoss("mean"), evenly=True, - weight_dict={"u": 1, "v": 1, "p": 1}, name="EQ", ) - visualizer = { - "visulzie_u": ppsci.visualize.VisualizerVtu( - interior_data, - {"u": lambda d: d["u"], "v": lambda d: d["v"], "p": lambda d: d["p"]}, - VISU_FREQ, - "result_u", - ) - } - # initialize solver solver = ppsci.solver.Solver( model, @@ -324,7 +264,7 @@ def input_transform(input): iters_per_epoch=ITERS_PER_EPOCH, eval_during_train=False, save_freq=10, - log_freq=LOG_FREQ, + log_freq=1, equation=equation, ) @@ -337,7 +277,7 @@ def input_transform(input): "y": data_2d_xy_old[:, 1:2], "nu": data_2d_xy_old[:, 2:3], } - output_dict = predict(input_dict, solver) + output_dict = solver.predict(input_dict) u_pred = output_dict["u"].numpy().reshape(N_y, N_x, N_p) v_pred = output_dict["v"].numpy().reshape(N_y, N_x, N_p) p_pred = output_dict["p"].numpy().reshape(N_y, N_x, N_p) @@ -408,7 +348,7 @@ def input_transform(input): "y": data_2d_xy_test[:, 1:2], "nu": data_2d_xy_test[:, 2:3], } - output_dict_test = predict(input_dict_test, solver) + output_dict_test = solver.predict(input_dict_test) u_max_pred = output_dict_test["u"].numpy() # Analytical result, y = 0 diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index 19c62b765..86dcdbb83 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -23,7 +23,8 @@ class Swish(nn.Layer): def __init__(self, beta: float = 1.0): super().__init__() self.beta = paddle.create_parameter( - shape=[0], + shape=[1], + dtype=paddle.get_default_dtype(), default_initializer=paddle.nn.initializer.Constant(beta), ) diff --git a/ppsci/data/__init__.py b/ppsci/data/__init__.py index f39a663ff..fcdc6a838 100644 --- a/ppsci/data/__init__.py +++ b/ppsci/data/__init__.py @@ -78,6 +78,8 @@ def build_dataloader(_dataset, cfg): ) sampler_cfg["batch_size"] = cfg["batch_size"] + if sampler_cfg["shuffle"] is False: + logger.warning(f"Data picked by sampler is not shuffled") sampler = getattr(io, sampler_cls)(_dataset, **sampler_cfg) # build collate_fn if specified diff --git a/ppsci/equation/pde/navier_stokes.py b/ppsci/equation/pde/navier_stokes.py index d2021af2c..70cc3e86b 100644 --- a/ppsci/equation/pde/navier_stokes.py +++ b/ppsci/equation/pde/navier_stokes.py @@ -51,6 +51,7 @@ def continuity_compute_func(out): self.add_equation("continuity", continuity_compute_func) def momentum_x_compute_func(out): + nu = self.nu(out) if callable(self.nu) else self.nu x, y = out["x"], out["y"] u, v, p = out["u"], out["v"], out["p"] momentum_x = ( @@ -73,6 +74,7 @@ def momentum_x_compute_func(out): self.add_equation("momentum_x", momentum_x_compute_func) def momentum_y_compute_func(out): + nu = self.nu(out) if callable(self.nu) else self.nu x, y = out["x"], out["y"] u, v, p = out["u"], out["v"], out["p"] momentum_y = ( @@ -97,6 +99,7 @@ def momentum_y_compute_func(out): if self.dim == 3: def momentum_z_compute_func(out): + nu = self.nu(out) if callable(self.nu) else self.nu x, y, z = out["x"], out["y"], out["z"] u, v, w, p = out["u"], out["v"], out["w"], out["p"] momentum_z = ( diff --git a/ppsci/optimizer/optimizer.py b/ppsci/optimizer/optimizer.py index 2b68fc8fc..54679d265 100644 --- a/ppsci/optimizer/optimizer.py +++ b/ppsci/optimizer/optimizer.py @@ -19,9 +19,6 @@ from typing import Tuple from typing import Union -if TYPE_CHECKING: - import paddle - from paddle import nn from paddle import optimizer as optim from paddle import regularizer From 82e2e5ddb4645b678e2e811c165087509cea8896 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 10:08:09 +0000 Subject: [PATCH 17/31] merge new NS eqn which thinks of nu as variable --- examples/pipe/poiseuille_flow.py | 95 -------------------------------- 1 file changed, 95 deletions(-) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 7d0ea9dd9..926f02742 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -26,101 +26,6 @@ from ppsci.autodiff import jacobian from ppsci.equation.pde import base - -class NavierStokes(base.PDE): - """Class for navier-stokes equation. [nu] as self-variable - - Args: - rho (float): Density. - dim (int): Dimension of equation. - time (bool): Whether the euqation is time-dependent. - """ - - def __init__(self, rho: float, dim: int, time: bool): - super().__init__() - self.rho = rho - self.dim = dim - self.time = time - - def continuity_compute_func(out): - x, y, nu = out["x"], out["y"], out["nu"] - u, v = out["u"], out["v"] - continuity = jacobian(u, x) + jacobian(v, y) - - if self.dim == 3: - z = out["z"] - w = out["w"] - continuity += jacobian(w, z) - return continuity - - self.add_equation("continuity", continuity_compute_func) - - def momentum_x_compute_func(out): - x, y, nu = out["x"], out["y"], out["nu"] - u, v, p = out["u"], out["v"], out["p"] - momentum_x = ( - u * jacobian(u, x) - + v * jacobian(u, y) - - nu / rho * hessian(u, x) - - nu / rho * hessian(u, y) - + 1 / rho * jacobian(p, x) - ) - if self.time: - t = out["t"] - momentum_x += jacobian(u, t) - if self.dim == 3: - z = out["z"] - w = out["w"] - momentum_x += w * jacobian(u, z) - momentum_x -= nu / rho * hessian(u, z) - return momentum_x - - self.add_equation("momentum_x", momentum_x_compute_func) - - def momentum_y_compute_func(out): - x, y, nu = out["x"], out["y"], out["nu"] - u, v, p = out["u"], out["v"], out["p"] - momentum_y = ( - u * jacobian(v, x) - + v * jacobian(v, y) - - nu / rho * hessian(v, x) - - nu / rho * hessian(v, y) - + 1 / rho * jacobian(p, y) - ) - if self.time: - t = out["t"] - momentum_y += jacobian(v, t) - if self.dim == 3: - z = out["z"] - w = out["w"] - momentum_y += w * jacobian(v, z) - momentum_y -= nu / rho * hessian(v, z) - return momentum_y - - self.add_equation("momentum_y", momentum_y_compute_func) - - if self.dim == 3: - - def momentum_z_compute_func(out): - x, y, nu = out["x"], out["y"], out["nu"] - u, v, w, p = out["u"], out["v"], out["w"], out["p"] - momentum_z = ( - u * jacobian(w, x) - + v * jacobian(w, y) - + w * jacobian(w, z) - - nu / rho * hessian(w, x) - - nu / rho * hessian(w, y) - - nu / rho * hessian(w, z) - + 1 / rho * jacobian(p, z) - ) - if self.time: - t = out["t"] - momentum_z += jacobian(w, t) - return momentum_z - - self.add_equation("momentum_z", momentum_z_compute_func) - - if __name__ == "__main__": # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) From 7bef78e65c8d0955f0e520bb2533af4be82bf2f4 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 10:48:32 +0000 Subject: [PATCH 18/31] reformat transform --- examples/aneurysm/aneurysm_flow.py | 87 ++++++++++++++---------------- examples/pipe/poiseuille_flow.py | 67 ++++++++++++----------- ppsci/arch/mlp.py | 2 +- 3 files changed, 77 insertions(+), 79 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 1153a6688..d329074dc 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -15,12 +15,12 @@ ppsci.utils.misc.set_random_seed(42) # set output directory - OUTPUT_DIR = "./output_0601" + OUTPUT_DIR = "./output_aneurysm_flow" PLOT_DIR = osp.join(OUTPUT_DIR, "visu") os.makedirs(PLOT_DIR, exist_ok=True) # initialize logger ppsci.utils.logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") - core.set_prim_eager_enabled(True) + core.set_prim_eager_enabled(False) # Hyper parameters EPOCHS = 500 @@ -114,59 +114,50 @@ def init_func(m): model_2.apply(init_func) model_3.apply(init_func) - # print(f"layer 1 mean : {np.mean(model_1.linears[0].weight.numpy())}") - # print(f"layer 1 var : {np.var(model_1.linears[0].weight.numpy())}") - - # print(f"layer 2 mean : {np.mean(model_1.linears[1].weight.numpy())}") - # print(f"layer 2 var : {np.var(model_1.linears[1].weight.numpy())}") - - # print(f"layer 3 mean : {np.mean(model_1.linears[2].weight.numpy())}") - # print(f"layer 3 var : {np.var(model_1.linears[2].weight.numpy())}") - - # print(f"layer 4 mean : {np.mean(model_1.last_fc.weight.numpy())}") - # print(f"layer 4 var : {np.var(model_1.last_fc.weight.numpy())}") - - class Output_transform: + class Transform: def __init__(self) -> None: pass - def __call__(self, out, input): - new_out = {} - x, y, scale = input["x"], input["y"], input["scale"] - # axisymetric boundary - if next(iter(out.keys())) == "u": - R = ( - scale - * 1 - / np.sqrt(2 * np.pi * SIGMA**2) - * paddle.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) - ) - self.h = R_INLET - R - u = out["u"] - # The no-slip condition of velocity on the wall - new_out["u"] = u * (self.h**2 - y**2) - elif next(iter(out.keys())) == "v": - v = out["v"] - # The no-slip condition of velocity on the wall - new_out["v"] = (self.h**2 - y**2) * v - elif next(iter(out.keys())) == "p": - p = out["p"] - # The pressure inlet [p_in = 0.1] and outlet [p_out = 0] - new_out["p"] = ( + def input_trans(self, input): + self.input = input + + def output_trans_u(self, out): + x, scale = self.input["x"], self.input["scale"] + R = ( + scale + * 1 + / np.sqrt(2 * np.pi * SIGMA**2) + * paddle.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) + ) + self.h = R_INLET - R + u = out["u"] + # The no-slip condition of velocity on the wall + return {"u": u * (self.h**2 - y**2)} + + def output_trans_v(self, out): + y = self.input["y"] + v = out["v"] + # The no-slip condition of velocity on the wall + return {"v": (self.h**2 - y**2) * v} + + def output_trans_p(self, out): + x = self.input["x"] + p = out["p"] + # The pressure inlet [p_in = 0.1] and outlet [p_out = 0] + return { + "p": ( (X_IN - x) * 0 + (P_IN - P_OUT) * (X_OUT - x) / L - + 0 * y + (X_IN - x) * (X_OUT - x) * p ) - else: - ValueError(f"{next(iter(out.keys()))} is not a valid key.") - - return new_out - - shared_transform = Output_transform() - model_1.register_output_transform(shared_transform) - model_2.register_output_transform(shared_transform) - model_3.register_output_transform(shared_transform) + } + + model_1.register_input_transform(Transform.input_trans) + model_2.register_input_transform(Transform.input_trans) + model_3.register_input_transform(Transform.input_trans) + model_1.register_output_transform(Transform.output_trans_u) + model_2.register_output_transform(Transform.output_trans_v) + model_3.register_output_transform(Transform.output_trans_p) model = ppsci.arch.ModelList((model_1, model_2, model_3)) optimizer_1 = ppsci.optimizer.Adam( diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 926f02742..eaa617ee2 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -31,9 +31,9 @@ ppsci.utils.misc.set_random_seed(42) # set output directory - output_dir = "./output_0602" + output_dir = "./output_poiseuille_flow" - core.set_prim_eager_enabled(True) + core.set_prim_eager_enabled(False) # initialize logger ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") @@ -99,34 +99,41 @@ model_p = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("p"), 3, 50, "swish") - def input_transform(input): - x, y = input["x"], input["y"] - nu = input["nu"] - b = 2 * np.pi / (X_OUT - X_IN) - c = np.pi * (X_IN + X_OUT) / (X_IN - X_OUT) - sin_x = X_IN * paddle.sin(b * x + c) - cos_x = X_IN * paddle.cos(b * x + c) - return {"sin(x)": sin_x, "cos(x)": cos_x, "y": y, "nu": nu} - - model_u.register_input_transform(input_transform) - model_v.register_input_transform(input_transform) - model_p.register_input_transform(input_transform) - model_u.register_output_transform( - lambda out, input: {"u": out["u"] * (R**2 - input["y"] ** 2)} - ) - model_v.register_output_transform( - lambda out, input: {"v": (R**2 - input["y"] ** 2) * out["v"]} - ) - model_p.register_output_transform( - lambda out, input: { - "p": ( - (X_IN - input["x"]) * 0 - + (P_IN - P_OUT) * (X_OUT - input["x"]) / L - + 0 * input["y"] - + (X_IN - input["x"]) * (X_OUT - input["x"]) * out["p"] - ) - } - ) + class Transform: + def __init__(self) -> None: + pass + + def input_trans(self, input): + self.input = input + x, y = input["x"], input["y"] + nu = input["nu"] + b = 2 * np.pi / (X_OUT - X_IN) + c = np.pi * (X_IN + X_OUT) / (X_IN - X_OUT) + sin_x = X_IN * paddle.sin(b * x + c) + cos_x = X_IN * paddle.cos(b * x + c) + return {"sin(x)": sin_x, "cos(x)": cos_x, "y": y, "nu": nu} + + def output_trans_u(self, out): + return {"u": out["u"] * (R**2 - self.input["y"] ** 2)} + + def output_trans_v(self, out): + return {"v": (R**2 - self.input["y"] ** 2) * out["v"]} + + def output_trans_p(self, out): + return { + "p": ( + (X_IN - self.input["x"]) * 0 + + (P_IN - P_OUT) * (X_OUT - self.input["x"]) / L + + (X_IN - self.input["x"]) * (X_OUT - self.input["x"]) * out["p"] + ) + } + + model_u.register_input_transform(Transform.input_trans) + model_v.register_input_transform(Transform.input_trans) + model_p.register_input_transform(Transform.input_trans) + model_u.register_output_transform(Transform.output_trans_u) + model_v.register_output_transform(Transform.output_trans_v) + model_p.register_output_transform(Transform.output_trans_p) model = ppsci.arch.ModelList((model_u, model_v, model_p)) # set optimizer diff --git a/ppsci/arch/mlp.py b/ppsci/arch/mlp.py index ef48ebf6f..3613a8aeb 100644 --- a/ppsci/arch/mlp.py +++ b/ppsci/arch/mlp.py @@ -151,5 +151,5 @@ def forward(self, x): y = self.split_to_dict(y, self.output_keys, axis=1) if self._output_transform is not None: - y = self._output_transform(y, x) + y = self._output_transform(y) return y From 334c2a9432f6917bc080f3e1f3cfb147399d7097 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 10:59:18 +0000 Subject: [PATCH 19/31] recover mlp code --- examples/pipe/poiseuille_flow.py | 2 +- ppsci/arch/mlp.py | 8 +++----- ppsci/data/__init__.py | 2 -- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index eaa617ee2..1b5598679 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -137,7 +137,7 @@ def output_trans_p(self, out): model = ppsci.arch.ModelList((model_u, model_v, model_p)) # set optimizer - optimizer = ppsci.optimizer.Adam(LEARNING_RATE)([model]) + optimizer = ppsci.optimizer.Adam(LEARNING_RATE)((model,)) # set euqation equation = { diff --git a/ppsci/arch/mlp.py b/ppsci/arch/mlp.py index 3613a8aeb..890e325fa 100644 --- a/ppsci/arch/mlp.py +++ b/ppsci/arch/mlp.py @@ -143,12 +143,10 @@ def forward_tensor(self, x): def forward(self, x): if self._input_transform is not None: - _x = self._input_transform(x) - else: - _x = x - y = self.concat_to_tensor(_x, self.input_keys, axis=1) + x = self._input_transform(x) + y = self.concat_to_tensor(x, self.input_keys, axis=-1) y = self.forward_tensor(y) - y = self.split_to_dict(y, self.output_keys, axis=1) + y = self.split_to_dict(y, self.output_keys, axis=-1) if self._output_transform is not None: y = self._output_transform(y) diff --git a/ppsci/data/__init__.py b/ppsci/data/__init__.py index fcdc6a838..f39a663ff 100644 --- a/ppsci/data/__init__.py +++ b/ppsci/data/__init__.py @@ -78,8 +78,6 @@ def build_dataloader(_dataset, cfg): ) sampler_cfg["batch_size"] = cfg["batch_size"] - if sampler_cfg["shuffle"] is False: - logger.warning(f"Data picked by sampler is not shuffled") sampler = getattr(io, sampler_cls)(_dataset, **sampler_cfg) # build collate_fn if specified From b80657affca9e231a2dd64996796069dde30469d Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Fri, 2 Jun 2023 11:01:10 +0000 Subject: [PATCH 20/31] delete blank line --- ppsci/arch/mlp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ppsci/arch/mlp.py b/ppsci/arch/mlp.py index 890e325fa..ebd36bb2b 100644 --- a/ppsci/arch/mlp.py +++ b/ppsci/arch/mlp.py @@ -144,6 +144,7 @@ def forward_tensor(self, x): def forward(self, x): if self._input_transform is not None: x = self._input_transform(x) + y = self.concat_to_tensor(x, self.input_keys, axis=-1) y = self.forward_tensor(y) y = self.split_to_dict(y, self.output_keys, axis=-1) From ec6f9fd3ffa58fc2bbc9481ec337cd1eb71e8fed Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Mon, 5 Jun 2023 03:17:11 +0000 Subject: [PATCH 21/31] fix by reviews --- examples/aneurysm/aneurysm_flow.py | 110 +++++++++++++++------------- examples/pipe/poiseuille_flow.py | 2 - ppsci/arch/activation.py | 5 +- ppsci/equation/pde/navier_stokes.py | 7 +- 4 files changed, 69 insertions(+), 55 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index d329074dc..ae78d6d04 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -1,3 +1,17 @@ +# Copyright (c) 2023 PaddlePaddle Authors. All Rights Reserved. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import math import os import os.path as osp @@ -5,12 +19,13 @@ import matplotlib.pyplot as plt import numpy as np import paddle -from paddle.fluid import core import ppsci +from ppsci.utils import config from ppsci.utils import misc if __name__ == "__main__": + args = config.parse_args() # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) @@ -20,12 +35,8 @@ os.makedirs(PLOT_DIR, exist_ok=True) # initialize logger ppsci.utils.logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") - core.set_prim_eager_enabled(False) # Hyper parameters - EPOCHS = 500 - BATCH_SIZE = 50 - LEARNING_RATE = 1e-3 # Physic properties P_OUT = 0 # pressure at the outlet of pipe @@ -59,7 +70,6 @@ # Axisymetric boundary R = ( scale - * 1 / math.sqrt(2 * np.pi * SIGMA**2) * np.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) ) @@ -89,27 +99,18 @@ plt.axis("equal") plt.savefig(osp.join(PLOT_DIR, "one_scale_sample"), bbox_inches="tight") - np.savez("x_0526_pd", x=x) - np.savez("y_0526_pd", y=y) - np.savez("scale_0526_pd", scale=scale) interior_geom = ppsci.geometry.PointCloud( interior={"x": x, "y": y, "scale": scale}, - coord_keys=["x", "y", "scale"], + coord_keys=("x", "y", "scale"), ) def init_func(m): if misc.typename(m) == "Linear": ppsci.utils.initializer.kaiming_normal_(m.weight, reverse=True) - model_1 = ppsci.arch.MLP( - ("x", "y", "scale"), ("u"), 3, 20, "silu" - ) # swish without learnable variable - model_2 = ppsci.arch.MLP( - ("x", "y", "scale"), ("v"), 3, 20, "silu" - ) # swish without learnable variable - model_3 = ppsci.arch.MLP( - ("x", "y", "scale"), ("p"), 3, 20, "silu" - ) # swish without learnable variable + model_1 = ppsci.arch.MLP(("x", "y", "scale"), ("u"), 3, 20, "silu") + model_2 = ppsci.arch.MLP(("x", "y", "scale"), ("v"), 3, 20, "silu") + model_3 = ppsci.arch.MLP(("x", "y", "scale"), ("p"), 3, 20, "silu") model_1.apply(init_func) model_2.apply(init_func) model_3.apply(init_func) @@ -125,7 +126,6 @@ def output_trans_u(self, out): x, scale = self.input["x"], self.input["scale"] R = ( scale - * 1 / np.sqrt(2 * np.pi * SIGMA**2) * paddle.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) ) @@ -160,6 +160,8 @@ def output_trans_p(self, out): model_3.register_output_transform(Transform.output_trans_p) model = ppsci.arch.ModelList((model_1, model_2, model_3)) + LEARNING_RATE = 1e-3 + optimizer_1 = ppsci.optimizer.Adam( LEARNING_RATE, beta1=0.9, beta2=0.99, epsilon=1e-15 )((model_1,)) @@ -173,6 +175,8 @@ def output_trans_p(self, out): equation = {"NavierStokes": ppsci.equation.NavierStokes(NU, RHO, 2, False)} + BATCH_SIZE = 50 + pde_constraint = ppsci.constraint.InteriorConstraint( equation["NavierStokes"].equations, {"continuity": 0, "momentum_x": 0, "momentum_y": 0}, @@ -184,7 +188,7 @@ def output_trans_p(self, out): "iters_per_epoch": int(x.shape[0] / BATCH_SIZE), "sampler": { "name": "BatchSampler", - "shuffle": False, + "shuffle": True, "drop_last": False, }, }, @@ -192,18 +196,20 @@ def output_trans_p(self, out): evenly=True, name="EQ", ) - constrain_dict = {pde_constraint.name: pde_constraint} + constraint = {pde_constraint.name: pde_constraint} + + EPOCHS = 500 if not args.epochs else args.epochs + # initialize solver solver = ppsci.solver.Solver( model, - constrain_dict, + constraint, OUTPUT_DIR, optimizer, epochs=EPOCHS, iters_per_epoch=int(x.shape[0] / BATCH_SIZE), - eval_during_train=False, save_freq=10, - log_freq=1, + log_freq=10, equation=equation, ) @@ -213,16 +219,14 @@ def single_test(x, y, scale, solver): xt = paddle.to_tensor(x) yt = paddle.to_tensor(y) scalet = scale * paddle.ones_like(xt) - net_in = {"x": xt, "y": yt, "scale": scalet} - output_dict = solver.predict(net_in, 100) + input_dict = {"x": xt, "y": yt, "scale": scalet} + output_dict = solver.predict(input_dict, batch_size=100) return output_dict scale_test = np.load("./data/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ "scale" ] - CASE_COUNT = [1.0, 151.0, 486.0] - w_ctl = np.zeros([len(scale_test), 1]) - w_ctl_Ml = np.zeros([len(scale_test), 1]) + CASE_SELECTED = [1, 151, 486] PLOT_X = 0.8 PLOT_Y = 0.06 FONTSIZE = 14 @@ -235,10 +239,10 @@ def single_test(x, y, scale, solver): x_centerline = np.linspace( X_IN, X_OUT, N_CL, dtype=paddle.get_default_dtype() ).reshape(N_CL, 1) - y_centerline = np.zeros_like(x_centerline, dtype=paddle.get_default_dtype()) - for caseIdx in CASE_COUNT: - scale = scale_test[int(caseIdx - 1)] - data_CFD = np.load(osp.join(path, str(caseIdx) + "CFD_contour.npz")) + y_centerline = np.zeros_like(x_centerline) + for case_id in CASE_SELECTED: + scale = scale_test[case_id - 1] + data_CFD = np.load(osp.join(path, f"{case_id}CFD_contour.npz")) x = data_CFD["x"].astype(paddle.get_default_dtype()) y = data_CFD["y"].astype(paddle.get_default_dtype()) u_cfd = data_CFD["U"].astype(paddle.get_default_dtype()) @@ -248,10 +252,14 @@ def single_test(x, y, scale, solver): output_dict = single_test( x.reshape(n, 1), y.reshape(n, 1), - np.ones((n, 1), dtype=paddle.get_default_dtype()) * scale, + np.full((n, 1), scale, dtype=paddle.get_default_dtype()), solver, ) - u, v, p = output_dict["u"], output_dict["v"], output_dict["p"] + u, v, p = ( + output_dict["u"].numpy(), + output_dict["v"].numpy(), + output_dict["p"].numpy(), + ) w = np.zeros_like(u) u_vec = np.concatenate([u, v, w], axis=1) error_u.append( @@ -275,7 +283,7 @@ def single_test(x, y, scale, solver): plt.text(PLOT_X, PLOT_Y, r"CFD", {"color": "b", "fontsize": FONTSIZE}) plt.axis(axis_limit) plt.savefig( - osp.join(PLOT_DIR, f"{int(caseIdx)}_scale_{scale}_uContour_test.png"), + osp.join(PLOT_DIR, f"{case_id}_scale_{scale}_uContour_test.png"), bbox_inches="tight", ) @@ -292,31 +300,31 @@ def single_test(x, y, scale, solver): plt.text(PLOT_X, PLOT_Y, r"CFD", {"color": "b", "fontsize": FONTSIZE}) plt.axis(axis_limit) plt.savefig( - osp.join(PLOT_DIR, f"{int(caseIdx)}_scale_{scale}_vContour_test.png"), + osp.join(PLOT_DIR, f"{case_id}_scale_{scale}_vContour_test.png"), bbox_inches="tight", ) plt.close("all") # Centerline wall shear profile tau_c (downside) - data_CFD_wss = np.load(path + str(caseIdx) + "CFD_wss.npz") + data_CFD_wss = np.load(osp.join(path, f"{case_id}CFD_wss.npz")) x_inital = data_CFD_wss["x"] wall_shear_mag_up = data_CFD_wss["wss"] D_H = 0.001 # The spanwise distance is approximately the height of the wall r_cl = ( scale - * 1 / np.sqrt(2 * np.pi * SIGMA**2) * np.exp(-((x_centerline - mu) ** 2) / (2 * SIGMA**2)) ) - y_wall = (-R_INLET + D_H) * np.ones_like( - x_centerline, dtype=paddle.get_default_dtype() - ) + r_cl + y_wall = (-R_INLET + D_H) * np.ones_like(x_centerline) + r_cl output_dict_wss = single_test( - x_centerline, y_wall, np.ones((N_CL, 1)) * scale, solver + x_centerline, + y_wall, + np.full((N_CL, 1), scale, dtype=paddle.get_default_dtype()), + solver, ) v_cl_total = np.zeros_like( - x_centerline, dtype=paddle.get_default_dtype() + x_centerline ) # assuming normal velocity along the wall is zero u_cl = output_dict_wss["u"].numpy() v_cl = output_dict_wss["v"].numpy() @@ -348,10 +356,14 @@ def single_test(x, y, scale, solver): plt.ylabel(r"$\tau_{c}$", fontsize=16) plt.legend(prop={"size": 16}) plt.savefig( - osp.join(PLOT_DIR, f"{int(caseIdx)}_nu__{scale}_wallshear_test.png"), + osp.join(PLOT_DIR, f"{case_id}_nu__{scale}_wallshear_test.png"), bbox_inches="tight", ) plt.close("all") - print(f"epochs = {EPOCHS}") - print(f"Table 1 : Aneurysm - Geometry error u : {sum(error_u) / len(error_u): .3e}") - print(f"Table 1 : Aneurysm - Geometry error v : {sum(error_v) / len(error_v): .3e}") + ppsci.utils.logger(f"epochs = {EPOCHS}") + ppsci.utils.logger( + f"Table 1 : Aneurysm - Geometry error u : {sum(error_u) / len(error_u): .3e}" + ) + ppsci.utils.logger( + f"Table 1 : Aneurysm - Geometry error v : {sum(error_v) / len(error_v): .3e}" + ) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 1b5598679..b5b1144bb 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -94,9 +94,7 @@ # set model model_u = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("u"), 3, 50, "swish") - model_v = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("v"), 3, 50, "swish") - model_p = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("p"), 3, 50, "swish") class Transform: diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index 86dcdbb83..73dc74f9f 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -22,11 +22,12 @@ class Swish(nn.Layer): def __init__(self, beta: float = 1.0): super().__init__() - self.beta = paddle.create_parameter( + self.beta = self.create_parameter( shape=[1], dtype=paddle.get_default_dtype(), default_initializer=paddle.nn.initializer.Constant(beta), ) + self.add_parameter("beta", beta) def forward(self, x): return x * F.sigmoid(self.beta * x) @@ -43,10 +44,10 @@ def silu(x): "selu": F.selu, "gelu": F.gelu, "sigmoid": F.sigmoid, + "silu": silu, "sin": paddle.sin, "cos": paddle.cos, "swish": Swish(), - "silu": silu, "tanh": F.tanh, "identity": nn.Identity(), } diff --git a/ppsci/equation/pde/navier_stokes.py b/ppsci/equation/pde/navier_stokes.py index 70cc3e86b..b2553bb40 100644 --- a/ppsci/equation/pde/navier_stokes.py +++ b/ppsci/equation/pde/navier_stokes.py @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Callable +from typing import Union + from ppsci.autodiff import hessian from ppsci.autodiff import jacobian from ppsci.equation.pde import base @@ -21,7 +24,7 @@ class NavierStokes(base.PDE): """Class for navier-stokes equation. Args: - nu (float): Dynamic viscosity. + nu (Union[float, Callable]): Dynamic viscosity. rho (float): Density. dim (int): Dimension of equation. time (bool): Whether the euqation is time-dependent. @@ -31,7 +34,7 @@ class NavierStokes(base.PDE): >>> pde = ppsci.equation.NavierStokes(0.1, 1.0, 3, False) """ - def __init__(self, nu: float, rho: float, dim: int, time: bool): + def __init__(self, nu: Union[float, Callable], rho: float, dim: int, time: bool): super().__init__() self.nu = nu self.rho = rho From 31aeea8e24de8eeecef71baf887334c6820a7379 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Mon, 5 Jun 2023 03:27:26 +0000 Subject: [PATCH 22/31] fix epochs --- examples/pipe/poiseuille_flow.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index b5b1144bb..def1ec70e 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -19,22 +19,18 @@ import numpy as np import paddle import seaborn as sns -from paddle.fluid import core import ppsci -from ppsci.autodiff import hessian -from ppsci.autodiff import jacobian -from ppsci.equation.pde import base +from ppsci.utils import config if __name__ == "__main__": + args = config.parse_args() # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) # set output directory output_dir = "./output_poiseuille_flow" - core.set_prim_eager_enabled(False) - # initialize logger ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") @@ -52,7 +48,7 @@ LEARNING_RATE = 5e-3 BATCH_SIZE = 128 - EPOCHS = 3000 # 5000 + EPOCHS = 3000 if not args.epochs else args.epochs # 5000 ITERS_PER_EPOCH = int((N_x * N_y * N_p) / BATCH_SIZE) EVAL_FREQ = 100 # display step From 669a0c5ec8ff420294814880840d3ce5a4f7e834 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Mon, 5 Jun 2023 03:33:07 +0000 Subject: [PATCH 23/31] delete useless lines --- examples/aneurysm/aneurysm_flow.py | 2 -- examples/pipe/poiseuille_flow.py | 15 +++++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index ae78d6d04..f761ce4b5 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -36,8 +36,6 @@ # initialize logger ppsci.utils.logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") - # Hyper parameters - # Physic properties P_OUT = 0 # pressure at the outlet of pipe P_IN = 0.1 # pressure at the inlet of pipe diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index def1ec70e..5eb520454 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -46,14 +46,6 @@ N_y = 50 N_p = 50 - LEARNING_RATE = 5e-3 - BATCH_SIZE = 128 - EPOCHS = 3000 if not args.epochs else args.epochs # 5000 - ITERS_PER_EPOCH = int((N_x * N_y * N_p) / BATCH_SIZE) - - EVAL_FREQ = 100 # display step - VISU_FREQ = 100 # visulize step - X_IN = 0 X_OUT = X_IN + L Y_START = -R @@ -130,6 +122,8 @@ def output_trans_p(self, out): model_p.register_output_transform(Transform.output_trans_p) model = ppsci.arch.ModelList((model_u, model_v, model_p)) + LEARNING_RATE = 5e-3 + # set optimizer optimizer = ppsci.optimizer.Adam(LEARNING_RATE)((model,)) @@ -140,6 +134,9 @@ def output_trans_p(self, out): ) } + BATCH_SIZE = 128 + ITERS_PER_EPOCH = int((N_x * N_y * N_p) / BATCH_SIZE) + pde_constraint = ppsci.constraint.InteriorConstraint( equation["NavierStokes"].equations, {"continuity": 0, "momentum_x": 0, "momentum_y": 0}, @@ -160,6 +157,8 @@ def output_trans_p(self, out): name="EQ", ) + EPOCHS = 3000 if not args.epochs else args.epochs # 5000 + # initialize solver solver = ppsci.solver.Solver( model, From 2af8a3a88d2526c7a77984ac9db9ce6d7e5d19eb Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Mon, 5 Jun 2023 06:34:12 +0000 Subject: [PATCH 24/31] bug fix --- examples/aneurysm/aneurysm_flow.py | 27 +++++++++++++++------------ examples/pipe/poiseuille_flow.py | 18 ++++++++++-------- ppsci/arch/activation.py | 2 +- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index f761ce4b5..932610320 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -22,6 +22,7 @@ import ppsci from ppsci.utils import config +from ppsci.utils import logger from ppsci.utils import misc if __name__ == "__main__": @@ -34,7 +35,7 @@ PLOT_DIR = osp.join(OUTPUT_DIR, "visu") os.makedirs(PLOT_DIR, exist_ok=True) # initialize logger - ppsci.utils.logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") + logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") # Physic properties P_OUT = 0 # pressure at the outlet of pipe @@ -119,9 +120,10 @@ def __init__(self) -> None: def input_trans(self, input): self.input = input + return input def output_trans_u(self, out): - x, scale = self.input["x"], self.input["scale"] + x, y, scale = self.input["x"], self.input["y"], self.input["scale"] R = ( scale / np.sqrt(2 * np.pi * SIGMA**2) @@ -150,12 +152,13 @@ def output_trans_p(self, out): ) } - model_1.register_input_transform(Transform.input_trans) - model_2.register_input_transform(Transform.input_trans) - model_3.register_input_transform(Transform.input_trans) - model_1.register_output_transform(Transform.output_trans_u) - model_2.register_output_transform(Transform.output_trans_v) - model_3.register_output_transform(Transform.output_trans_p) + trm = Transform() + model_1.register_input_transform(trm.input_trans) + model_2.register_input_transform(trm.input_trans) + model_3.register_input_transform(trm.input_trans) + model_1.register_output_transform(trm.output_trans_u) + model_2.register_output_transform(trm.output_trans_v) + model_3.register_output_transform(trm.output_trans_p) model = ppsci.arch.ModelList((model_1, model_2, model_3)) LEARNING_RATE = 1e-3 @@ -211,7 +214,7 @@ def output_trans_p(self, out): equation=equation, ) - solver.train() + # solver.train() def single_test(x, y, scale, solver): xt = paddle.to_tensor(x) @@ -358,10 +361,10 @@ def single_test(x, y, scale, solver): bbox_inches="tight", ) plt.close("all") - ppsci.utils.logger(f"epochs = {EPOCHS}") - ppsci.utils.logger( + logger.info(f"epochs = {EPOCHS}") + logger.info( f"Table 1 : Aneurysm - Geometry error u : {sum(error_u) / len(error_u): .3e}" ) - ppsci.utils.logger( + logger.info( f"Table 1 : Aneurysm - Geometry error v : {sum(error_v) / len(error_v): .3e}" ) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 5eb520454..5a6ea1411 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -22,6 +22,7 @@ import ppsci from ppsci.utils import config +from ppsci.utils import logger if __name__ == "__main__": args = config.parse_args() @@ -32,7 +33,7 @@ output_dir = "./output_poiseuille_flow" # initialize logger - ppsci.utils.logger.init_logger("ppsci", f"{output_dir}/train.log", "info") + logger.init_logger("ppsci", f"{output_dir}/train.log", "info") NU_MEAN = 0.001 NU_STD = 0.9 @@ -114,12 +115,13 @@ def output_trans_p(self, out): ) } - model_u.register_input_transform(Transform.input_trans) - model_v.register_input_transform(Transform.input_trans) - model_p.register_input_transform(Transform.input_trans) - model_u.register_output_transform(Transform.output_trans_u) - model_v.register_output_transform(Transform.output_trans_v) - model_p.register_output_transform(Transform.output_trans_p) + trm = Transform() + model_u.register_input_transform(trm.input_trans) + model_v.register_input_transform(trm.input_trans) + model_p.register_input_transform(trm.input_trans) + model_u.register_output_transform(trm.output_trans_u) + model_v.register_output_transform(trm.output_trans_v) + model_p.register_output_transform(trm.output_trans_p) model = ppsci.arch.ModelList((model_u, model_v, model_p)) LEARNING_RATE = 5e-3 @@ -173,7 +175,7 @@ def output_trans_p(self, out): equation=equation, ) - solver.train() + # solver.train() # Cross-section velocity profiles of 4 different viscosity sample # Predicted result diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index 73dc74f9f..b010a49d1 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -27,7 +27,7 @@ def __init__(self, beta: float = 1.0): dtype=paddle.get_default_dtype(), default_initializer=paddle.nn.initializer.Constant(beta), ) - self.add_parameter("beta", beta) + self.add_parameter("beta", self.beta) def forward(self, x): return x * F.sigmoid(self.beta * x) From f821d82927287baaae48b32d7049a02da28c51ac Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Mon, 5 Jun 2023 06:41:21 +0000 Subject: [PATCH 25/31] forget to uncomment train --- examples/aneurysm/aneurysm_flow.py | 2 +- examples/pipe/poiseuille_flow.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 932610320..0fdfcb862 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -214,7 +214,7 @@ def output_trans_p(self, out): equation=equation, ) - # solver.train() + solver.train() def single_test(x, y, scale, solver): xt = paddle.to_tensor(x) diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 5a6ea1411..81515c27c 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -175,7 +175,7 @@ def output_trans_p(self, out): equation=equation, ) - # solver.train() + solver.train() # Cross-section velocity profiles of 4 different viscosity sample # Predicted result From 1f30ad4325bf1e69ac8321cc9071ae46cca19953 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Mon, 5 Jun 2023 12:30:09 +0000 Subject: [PATCH 26/31] fix multi-learnable bug --- examples/aneurysm/aneurysm_flow.py | 3 ++ ppsci/arch/activation.py | 78 ++++++++++++++++++++++++++---- ppsci/arch/mlp.py | 18 +++---- 3 files changed, 79 insertions(+), 20 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 0fdfcb862..0ae949ab5 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -27,6 +27,8 @@ if __name__ == "__main__": args = config.parse_args() + paddle.fluid.core.set_prim_eager_enabled(True) + # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) @@ -34,6 +36,7 @@ OUTPUT_DIR = "./output_aneurysm_flow" PLOT_DIR = osp.join(OUTPUT_DIR, "visu") os.makedirs(PLOT_DIR, exist_ok=True) + # initialize logger logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index b010a49d1..4fcd63962 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -20,6 +20,15 @@ class Swish(nn.Layer): + r""" + Swish Activation. + + .. math:: + + Swish(x)= \aplpha x \cdot \frac{1}{1 + e^{-x}} + + """ + def __init__(self, beta: float = 1.0): super().__init__() self.beta = self.create_parameter( @@ -38,17 +47,68 @@ def silu(x): return x * F.sigmoid(x) +class SILU(nn.Layer): + r""" + SILU Activation. + + .. math:: + + SILU(x)= x \cdot \frac{1}{1 + e^{-x}} + + """ + + def __init__(self): + super().__init__() + + def forward(self, x): + return silu(x) + + +class Cos(nn.Layer): + r""" + Cos Activation. + + .. math:: + + Cos(x)= cos(x) + + """ + + def __init__(self): + super().__init__() + + def forward(self, x): + return paddle.cos(x) + + +class Sin(nn.Layer): + r""" + Sin Activation. + + .. math:: + + Sin(x)= sin(x) + + """ + + def __init__(self): + super().__init__() + + def forward(self, x): + return paddle.sin(x) + + act_func_dict = { - "elu": F.elu, - "relu": F.relu, - "selu": F.selu, - "gelu": F.gelu, - "sigmoid": F.sigmoid, - "silu": silu, - "sin": paddle.sin, - "cos": paddle.cos, + "elu": nn.ELU(), + "relu": nn.ReLU(), + "selu": nn.SELU(), + "gelu": nn.GELU(), + "sigmoid": nn.Sigmoid(), + "silu": SILU(), + "sin": Sin(), + "cos": Cos(), "swish": Swish(), - "tanh": F.tanh, + "tanh": nn.Tanh(), "identity": nn.Identity(), } diff --git a/ppsci/arch/mlp.py b/ppsci/arch/mlp.py index ebd36bb2b..b9daa67df 100644 --- a/ppsci/arch/mlp.py +++ b/ppsci/arch/mlp.py @@ -29,16 +29,10 @@ def __init__(self, in_features: int, out_features: int, bias: bool = True) -> No super().__init__() self.in_features = in_features self.out_features = out_features - self.weight_v = self.create_parameter( - (in_features, out_features), dtype=paddle.get_default_dtype() - ) - self.weight_g = self.create_parameter( - (out_features,), dtype=paddle.get_default_dtype() - ) + self.weight_v = self.create_parameter((in_features, out_features)) + self.weight_g = self.create_parameter((out_features,)) if bias: - self.bias = self.create_parameter( - (out_features,), dtype=paddle.get_default_dtype() - ) + self.bias = self.create_parameter((out_features,)) else: self.bias = None self._init_weights() @@ -120,7 +114,9 @@ def __init__( self.last_fc = nn.Linear(cur_size, len(self.output_keys)) # initialize activation function - self.act = act_mod.get_activation(activation) + self.act = nn.LayerList( + [act_mod.get_activation(activation) for _ in range(len(hidden_size))] + ) self.skip_connection = skip_connection @@ -135,7 +131,7 @@ def forward_tensor(self, x): y = y + skip else: skip = y - y = self.act(y) + y = self.act[i](y) y = self.last_fc(y) From 169759d5ad3ad5c532c3f28e3418147d9ab946dd Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Mon, 5 Jun 2023 13:19:52 +0000 Subject: [PATCH 27/31] fix by reviews --- examples/aneurysm/aneurysm_flow.py | 62 +++++++++++++------------- examples/pipe/poiseuille_flow.py | 70 +++++++++++++++--------------- ppsci/arch/activation.py | 54 +---------------------- 3 files changed, 68 insertions(+), 118 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 0ae949ab5..db5ed9a2e 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -34,8 +34,6 @@ # set output directory OUTPUT_DIR = "./output_aneurysm_flow" - PLOT_DIR = osp.join(OUTPUT_DIR, "visu") - os.makedirs(PLOT_DIR, exist_ok=True) # initialize logger logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") @@ -51,16 +49,18 @@ X_IN = 0 X_OUT = X_IN + L R_INLET = 0.05 - unique_x = np.linspace(X_IN, X_OUT, 100) mu = 0.5 * (X_OUT - X_IN) N_Y = 20 + x_inital = np.linspace(X_IN, X_OUT, 100, dtype=paddle.get_default_dtype()).reshape( 100, 1 ) x_20_copy = np.tile(x_inital, (20, 1)) # duplicate 20 times of x for dataloader + SIGMA = 0.1 SCALE_START = -0.02 SCALE_END = 0 + scale_initial = np.linspace( SCALE_START, SCALE_END, 50, endpoint=True, dtype=paddle.get_default_dtype() ).reshape(50, 1) @@ -70,15 +70,17 @@ ) # Axisymetric boundary - R = ( + r_func = ( scale / math.sqrt(2 * np.pi * SIGMA**2) * np.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) ) # Visualize stenosis(scale == 0.2) - y_up = (R_INLET - R) * np.ones_like(x) - y_down = (-R_INLET + R) * np.ones_like(x) + PLOT_DIR = osp.join(OUTPUT_DIR, "visu") + os.makedirs(PLOT_DIR, exist_ok=True) + y_up = (R_INLET - r_func) * np.ones_like(x) + y_down = (-R_INLET + r_func) * np.ones_like(x) idx = np.where(scale == 0) # plot vessel which scale is 0.2 by finding its indexs plt.figure() plt.scatter(x[idx], y_up[idx]) @@ -91,9 +93,12 @@ for x0 in x_inital: index = np.where(x[:, 0] == x0)[0] # y is linear to scale, so we place linespace to get 1000 x, it coressponds to vessels - y[index] = np.linspace(-max(y_up[index]), max(y_up[index]), len(index)).reshape( - len(index), -1 - ) + y[index] = np.linspace( + -max(y_up[index]), + max(y_up[index]), + len(index), + dtype=paddle.get_default_dtype(), + ).reshape(len(index), -1) idx = np.where(scale == 0) # plot vessel which scale is 0.2 by finding its indexs plt.figure() @@ -105,14 +110,15 @@ interior={"x": x, "y": y, "scale": scale}, coord_keys=("x", "y", "scale"), ) + geom = {"interior": interior_geom} def init_func(m): if misc.typename(m) == "Linear": ppsci.utils.initializer.kaiming_normal_(m.weight, reverse=True) - model_1 = ppsci.arch.MLP(("x", "y", "scale"), ("u"), 3, 20, "silu") - model_2 = ppsci.arch.MLP(("x", "y", "scale"), ("v"), 3, 20, "silu") - model_3 = ppsci.arch.MLP(("x", "y", "scale"), ("p"), 3, 20, "silu") + model_1 = ppsci.arch.MLP(("x", "y", "scale"), ("u",), 3, 20, "silu") + model_2 = ppsci.arch.MLP(("x", "y", "scale"), ("v",), 3, 20, "silu") + model_3 = ppsci.arch.MLP(("x", "y", "scale"), ("p",), 3, 20, "silu") model_1.apply(init_func) model_2.apply(init_func) model_3.apply(init_func) @@ -127,12 +133,12 @@ def input_trans(self, input): def output_trans_u(self, out): x, y, scale = self.input["x"], self.input["y"], self.input["scale"] - R = ( + r_func = ( scale / np.sqrt(2 * np.pi * SIGMA**2) * paddle.exp(-((x - mu) ** 2) / (2 * SIGMA**2)) ) - self.h = R_INLET - R + self.h = R_INLET - r_func u = out["u"] # The no-slip condition of velocity on the wall return {"u": u * (self.h**2 - y**2)} @@ -148,20 +154,16 @@ def output_trans_p(self, out): p = out["p"] # The pressure inlet [p_in = 0.1] and outlet [p_out = 0] return { - "p": ( - (X_IN - x) * 0 - + (P_IN - P_OUT) * (X_OUT - x) / L - + (X_IN - x) * (X_OUT - x) * p - ) + "p": ((P_IN - P_OUT) * (X_OUT - x) / L + (X_IN - x) * (X_OUT - x) * p) } - trm = Transform() - model_1.register_input_transform(trm.input_trans) - model_2.register_input_transform(trm.input_trans) - model_3.register_input_transform(trm.input_trans) - model_1.register_output_transform(trm.output_trans_u) - model_2.register_output_transform(trm.output_trans_v) - model_3.register_output_transform(trm.output_trans_p) + transform = Transform() + model_1.register_input_transform(transform.input_trans) + model_2.register_input_transform(transform.input_trans) + model_3.register_input_transform(transform.input_trans) + model_1.register_output_transform(transform.output_trans_u) + model_2.register_output_transform(transform.output_trans_v) + model_3.register_output_transform(transform.output_trans_p) model = ppsci.arch.ModelList((model_1, model_2, model_3)) LEARNING_RATE = 1e-3 @@ -184,7 +186,7 @@ def output_trans_p(self, out): pde_constraint = ppsci.constraint.InteriorConstraint( equation["NavierStokes"].equations, {"continuity": 0, "momentum_x": 0, "momentum_y": 0}, - geom=interior_geom, + geom=geom["interior"], dataloader_cfg={ "dataset": "NamedArrayDataset", "num_workers": 1, @@ -213,7 +215,6 @@ def output_trans_p(self, out): epochs=EPOCHS, iters_per_epoch=int(x.shape[0] / BATCH_SIZE), save_freq=10, - log_freq=10, equation=equation, ) @@ -222,7 +223,7 @@ def output_trans_p(self, out): def single_test(x, y, scale, solver): xt = paddle.to_tensor(x) yt = paddle.to_tensor(y) - scalet = scale * paddle.ones_like(xt) + scalet = paddle.full_like(xt, scale) input_dict = {"x": xt, "y": yt, "scale": scalet} output_dict = solver.predict(input_dict, batch_size=100) return output_dict @@ -332,8 +333,7 @@ def single_test(x, y, scale, solver): ) # assuming normal velocity along the wall is zero u_cl = output_dict_wss["u"].numpy() v_cl = output_dict_wss["v"].numpy() - for i in range(N_CL): - v_cl_total[i] = np.sqrt(u_cl[i] ** 2 + v_cl[i] ** 2) + v_cl_total = np.sqrt(u_cl**2 + v_cl**2) tau_c = NU * v_cl_total / D_H plt.figure() diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 81515c27c..d574995bd 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -14,6 +14,7 @@ import copy import os +import os.path as osp import matplotlib.pyplot as plt import numpy as np @@ -21,19 +22,24 @@ import seaborn as sns import ppsci +from ppsci.utils import checker from ppsci.utils import config from ppsci.utils import logger +if not checker.dynamic_import_to_globals("seaborn"): + raise ModuleNotFoundError(f"Please install seaborn through pip first.") + + if __name__ == "__main__": args = config.parse_args() # set random seed for reproducibility ppsci.utils.misc.set_random_seed(42) # set output directory - output_dir = "./output_poiseuille_flow" + OUTPUT_DIR = "./output_poiseuille_flow" # initialize logger - logger.init_logger("ppsci", f"{output_dir}/train.log", "info") + logger.init_logger("ppsci", f"{OUTPUT_DIR}/train.log", "info") NU_MEAN = 0.001 NU_STD = 0.9 @@ -68,12 +74,12 @@ data_2d_xy = ( np.array(np.meshgrid(data_1d_x, data_1d_y, data_1d_nu)).reshape(3, -1).T ) - data_2d_xy_old = copy.deepcopy(data_2d_xy) - np.random.shuffle(data_2d_xy) + data_2d_xy_shuffle = copy.deepcopy(data_2d_xy) + np.random.shuffle(data_2d_xy_shuffle) - input_x = data_2d_xy[:, 0].reshape(data_2d_xy.shape[0], 1) - input_y = data_2d_xy[:, 1].reshape(data_2d_xy.shape[0], 1) - input_nu = data_2d_xy[:, 2].reshape(data_2d_xy.shape[0], 1) + input_x = data_2d_xy_shuffle[:, 0].reshape(data_2d_xy_shuffle.shape[0], 1) + input_y = data_2d_xy_shuffle[:, 1].reshape(data_2d_xy_shuffle.shape[0], 1) + input_nu = data_2d_xy_shuffle[:, 2].reshape(data_2d_xy_shuffle.shape[0], 1) interior_data = {"x": input_x, "y": input_y, "nu": input_nu} interior_geom = ppsci.geometry.PointCloud( @@ -82,14 +88,11 @@ ) # set model - model_u = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("u"), 3, 50, "swish") - model_v = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("v"), 3, 50, "swish") - model_p = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("p"), 3, 50, "swish") + model_u = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("u",), 3, 50, "swish") + model_v = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("v",), 3, 50, "swish") + model_p = ppsci.arch.MLP(("sin(x)", "cos(x)", "y", "nu"), ("p",), 3, 50, "swish") class Transform: - def __init__(self) -> None: - pass - def input_trans(self, input): self.input = input x, y = input["x"], input["y"] @@ -109,25 +112,22 @@ def output_trans_v(self, out): def output_trans_p(self, out): return { "p": ( - (X_IN - self.input["x"]) * 0 - + (P_IN - P_OUT) * (X_OUT - self.input["x"]) / L + (P_IN - P_OUT) * (X_OUT - self.input["x"]) / L + (X_IN - self.input["x"]) * (X_OUT - self.input["x"]) * out["p"] ) } - trm = Transform() - model_u.register_input_transform(trm.input_trans) - model_v.register_input_transform(trm.input_trans) - model_p.register_input_transform(trm.input_trans) - model_u.register_output_transform(trm.output_trans_u) - model_v.register_output_transform(trm.output_trans_v) - model_p.register_output_transform(trm.output_trans_p) + transform = Transform() + model_u.register_input_transform(transform.input_trans) + model_v.register_input_transform(transform.input_trans) + model_p.register_input_transform(transform.input_trans) + model_u.register_output_transform(transform.output_trans_u) + model_v.register_output_transform(transform.output_trans_v) + model_p.register_output_transform(transform.output_trans_p) model = ppsci.arch.ModelList((model_u, model_v, model_p)) - LEARNING_RATE = 5e-3 - # set optimizer - optimizer = ppsci.optimizer.Adam(LEARNING_RATE)((model,)) + optimizer = ppsci.optimizer.Adam(5e-3)((model,)) # set euqation equation = { @@ -159,19 +159,18 @@ def output_trans_p(self, out): name="EQ", ) - EPOCHS = 3000 if not args.epochs else args.epochs # 5000 + EPOCHS = 3000 if not args.epochs else args.epochs # initialize solver solver = ppsci.solver.Solver( model, {pde_constraint.name: pde_constraint}, - output_dir, + OUTPUT_DIR, optimizer, epochs=EPOCHS, iters_per_epoch=ITERS_PER_EPOCH, eval_during_train=False, save_freq=10, - log_freq=1, equation=equation, ) @@ -180,9 +179,9 @@ def output_trans_p(self, out): # Cross-section velocity profiles of 4 different viscosity sample # Predicted result input_dict = { - "x": data_2d_xy_old[:, 0:1], - "y": data_2d_xy_old[:, 1:2], - "nu": data_2d_xy_old[:, 2:3], + "x": data_2d_xy[:, 0:1], + "y": data_2d_xy[:, 1:2], + "nu": data_2d_xy[:, 2:3], } output_dict = solver.predict(input_dict) u_pred = output_dict["u"].numpy().reshape(N_y, N_x, N_p) @@ -203,6 +202,8 @@ def output_trans_p(self, out): ytext = [0.45, 0.28, 0.1, 0.01] # Plot + PLOT_DIR = osp.join(OUTPUT_DIR, "visu") + os.makedirs(PLOT_DIR, exist_ok=True) plt.figure(1) plt.clf() for idxP in range(len(nu_index)): @@ -224,11 +225,10 @@ def output_trans_p(self, out): lw=2.0, alpha=1.0, ) - nu_current = float("{0:.5f}".format(data_1d_nu[nu_index[idxP]])) plt.text( -0.012, ytext[idxP], - r"$\nu = $" + str(nu_current), + rf"$\nu = $ {data_1d_nu[nu_index[idxP]]}", {"color": "k", "fontsize": fontsize}, ) @@ -238,7 +238,7 @@ def output_trans_p(self, out): ax1.tick_params(axis="y", labelsize=fontsize) ax1.set_xlim([-0.05, 0.05]) ax1.set_ylim([0.0, 0.62]) - plt.savefig("pipe_uProfiles.png", bbox_inches="tight") + plt.savefig(osp.join(PLOT_DIR, "pipe_uProfiles.png"), bbox_inches="tight") # Distribution of center velocity # Predicted result @@ -288,4 +288,4 @@ def output_trans_p(self, out): plt.ylabel(r"PDF", fontsize=fontsize) ax1.tick_params(axis="x", labelsize=fontsize) ax1.tick_params(axis="y", labelsize=fontsize) - plt.savefig("pipe_unformUQ.png", bbox_inches="tight") + plt.savefig(osp.join(PLOT_DIR, "pipe_unformUQ.png"), bbox_inches="tight") diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index 4fcd63962..71080923e 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -20,20 +20,10 @@ class Swish(nn.Layer): - r""" - Swish Activation. - - .. math:: - - Swish(x)= \aplpha x \cdot \frac{1}{1 + e^{-x}} - - """ - def __init__(self, beta: float = 1.0): super().__init__() self.beta = self.create_parameter( - shape=[1], - dtype=paddle.get_default_dtype(), + shape=[], default_initializer=paddle.nn.initializer.Constant(beta), ) self.add_parameter("beta", self.beta) @@ -42,38 +32,7 @@ def forward(self, x): return x * F.sigmoid(self.beta * x) -def silu(x): - """numeric stable silu""" - return x * F.sigmoid(x) - - -class SILU(nn.Layer): - r""" - SILU Activation. - - .. math:: - - SILU(x)= x \cdot \frac{1}{1 + e^{-x}} - - """ - - def __init__(self): - super().__init__() - - def forward(self, x): - return silu(x) - - class Cos(nn.Layer): - r""" - Cos Activation. - - .. math:: - - Cos(x)= cos(x) - - """ - def __init__(self): super().__init__() @@ -82,15 +41,6 @@ def forward(self, x): class Sin(nn.Layer): - r""" - Sin Activation. - - .. math:: - - Sin(x)= sin(x) - - """ - def __init__(self): super().__init__() @@ -104,7 +54,7 @@ def forward(self, x): "selu": nn.SELU(), "gelu": nn.GELU(), "sigmoid": nn.Sigmoid(), - "silu": SILU(), + "silu": nn.Silu(), "sin": Sin(), "cos": Cos(), "swish": Swish(), From 620e38ced66f57373e0d04583e719d5888f9b28e Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Tue, 6 Jun 2023 04:03:06 +0000 Subject: [PATCH 28/31] fix by reviews --- examples/aneurysm/aneurysm_flow.py | 21 +++++++++++---------- ppsci/arch/activation.py | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index db5ed9a2e..367467a61 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -220,13 +220,15 @@ def output_trans_p(self, out): solver.train() - def single_test(x, y, scale, solver): + def model_predict( + x: np.ndarray, y: np.ndarray, scale: np.ndarray, solver: ppsci.solver.Solver + ): xt = paddle.to_tensor(x) yt = paddle.to_tensor(y) scalet = paddle.full_like(xt, scale) input_dict = {"x": xt, "y": yt, "scale": scalet} output_dict = solver.predict(input_dict, batch_size=100) - return output_dict + return {k: v.numpy() for k, v in output_dict.items()} scale_test = np.load("./data/aneurysm_scale0005to002_eval0to002mean001_3sigma.npz")[ "scale" @@ -254,16 +256,16 @@ def single_test(x, y, scale, solver): # p_cfd = data_CFD["P"].astype(paddle.get_default_dtype()) # missing data n = len(x) - output_dict = single_test( + output_dict = model_predict( x.reshape(n, 1), y.reshape(n, 1), np.full((n, 1), scale, dtype=paddle.get_default_dtype()), solver, ) u, v, p = ( - output_dict["u"].numpy(), - output_dict["v"].numpy(), - output_dict["p"].numpy(), + output_dict["u"], + output_dict["v"], + output_dict["p"], ) w = np.zeros_like(u) u_vec = np.concatenate([u, v, w], axis=1) @@ -322,7 +324,7 @@ def single_test(x, y, scale, solver): * np.exp(-((x_centerline - mu) ** 2) / (2 * SIGMA**2)) ) y_wall = (-R_INLET + D_H) * np.ones_like(x_centerline) + r_cl - output_dict_wss = single_test( + output_dict_wss = model_predict( x_centerline, y_wall, np.full((N_CL, 1), scale, dtype=paddle.get_default_dtype()), @@ -331,8 +333,8 @@ def single_test(x, y, scale, solver): v_cl_total = np.zeros_like( x_centerline ) # assuming normal velocity along the wall is zero - u_cl = output_dict_wss["u"].numpy() - v_cl = output_dict_wss["v"].numpy() + u_cl = output_dict_wss["u"] + v_cl = output_dict_wss["v"] v_cl_total = np.sqrt(u_cl**2 + v_cl**2) tau_c = NU * v_cl_total / D_H @@ -364,7 +366,6 @@ def single_test(x, y, scale, solver): bbox_inches="tight", ) plt.close("all") - logger.info(f"epochs = {EPOCHS}") logger.info( f"Table 1 : Aneurysm - Geometry error u : {sum(error_u) / len(error_u): .3e}" ) diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index 71080923e..37b669c93 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -26,7 +26,6 @@ def __init__(self, beta: float = 1.0): shape=[], default_initializer=paddle.nn.initializer.Constant(beta), ) - self.add_parameter("beta", self.beta) def forward(self, x): return x * F.sigmoid(self.beta * x) @@ -48,13 +47,27 @@ def forward(self, x): return paddle.sin(x) +class SILU(nn.Layer): + r""" + SILU Activation. + .. math:: + SILU(x)= x \cdot \frac{1}{1 + e^{-x}} + """ + + def __init__(self): + super().__init__() + + def forward(self, x): + return x * F.sigmoid(x) + + act_func_dict = { "elu": nn.ELU(), "relu": nn.ReLU(), "selu": nn.SELU(), "gelu": nn.GELU(), "sigmoid": nn.Sigmoid(), - "silu": nn.Silu(), + "silu": SILU(), "sin": Sin(), "cos": Cos(), "swish": Swish(), From 76797fb765c053467029107d87a0f66d45ef78ae Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Tue, 6 Jun 2023 04:05:53 +0000 Subject: [PATCH 29/31] clean activation --- ppsci/arch/activation.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ppsci/arch/activation.py b/ppsci/arch/activation.py index 37b669c93..fa2a2e943 100644 --- a/ppsci/arch/activation.py +++ b/ppsci/arch/activation.py @@ -47,13 +47,7 @@ def forward(self, x): return paddle.sin(x) -class SILU(nn.Layer): - r""" - SILU Activation. - .. math:: - SILU(x)= x \cdot \frac{1}{1 + e^{-x}} - """ - +class Silu(nn.Layer): def __init__(self): super().__init__() @@ -67,7 +61,7 @@ def forward(self, x): "selu": nn.SELU(), "gelu": nn.GELU(), "sigmoid": nn.Sigmoid(), - "silu": SILU(), + "silu": Silu(), "sin": Sin(), "cos": Cos(), "swish": Swish(), From 4d933f39d32680e6383b1e9b56f0090a8d3b2608 Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Tue, 6 Jun 2023 06:39:52 +0000 Subject: [PATCH 30/31] add reference --- examples/aneurysm/aneurysm_flow.py | 5 +++++ examples/pipe/poiseuille_flow.py | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 367467a61..561012c05 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -12,6 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. + +""" +Reference: https://github.com/Jianxun-Wang/LabelFree-DNN-Surrogate +""" + import math import os import os.path as osp diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index d574995bd..2b5b66d79 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -12,6 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +""" +Reference: https://github.com/Jianxun-Wang/LabelFree-DNN-Surrogate +""" + import copy import os import os.path as osp From e974416665311926c66081134b9a5cb170cee73b Mon Sep 17 00:00:00 2001 From: wangguan <772359200@qq.com> Date: Wed, 7 Jun 2023 11:32:58 +0000 Subject: [PATCH 31/31] fix by reviews --- examples/aneurysm/aneurysm_flow.py | 3 +-- examples/pipe/poiseuille_flow.py | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/aneurysm/aneurysm_flow.py b/examples/aneurysm/aneurysm_flow.py index 561012c05..6207e712a 100644 --- a/examples/aneurysm/aneurysm_flow.py +++ b/examples/aneurysm/aneurysm_flow.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - """ Reference: https://github.com/Jianxun-Wang/LabelFree-DNN-Surrogate """ @@ -209,7 +208,7 @@ def output_trans_p(self, out): ) constraint = {pde_constraint.name: pde_constraint} - EPOCHS = 500 if not args.epochs else args.epochs + EPOCHS = 400 if not args.epochs else args.epochs # initialize solver solver = ppsci.solver.Solver( diff --git a/examples/pipe/poiseuille_flow.py b/examples/pipe/poiseuille_flow.py index 2b5b66d79..b2c7ed24e 100644 --- a/examples/pipe/poiseuille_flow.py +++ b/examples/pipe/poiseuille_flow.py @@ -263,9 +263,7 @@ def output_trans_p(self, out): u_max_pred = output_dict_test["u"].numpy() # Analytical result, y = 0 - u_max_a = np.zeros([num_test, 1]) - for i in range(num_test): - u_max_a[i] = (R**2) * dP / (2 * L * data_1d_nu_distribution[i] * RHO) + u_max_a = (R**2) * dP / (2 * L * data_1d_nu_distribution * RHO) # Plot plt.figure(2)