From 85e5e20e0f27c0cfdbe7191605498a878bb36c1d Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 13 Nov 2024 00:30:30 -0500 Subject: [PATCH 1/3] docs: document plugin mechanisms and deepmd-gnn (#4345) ## Summary by CodeRabbit - **New Features** - Introduced plugin mechanisms for external models in the DeePMD-kit. - Added comprehensive instructions for creating models using PyTorch and a framework-independent backend. - **Documentation** - Enhanced organization of the third-party documentation for better clarity and navigability. Signed-off-by: Jinzhe Zeng --- README.md | 1 + doc/development/create-a-model-pt.md | 1 + doc/third-party/out-of-deepmd-kit.md | 30 +++++++++++++++++++--------- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7e6879fcd1..18bdfd6560 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ See [our latest paper](https://doi.org/10.1063/5.0155600) for details of all fea - Multiple backends supported. Add PyTorch and JAX backends. - The DPA-2 model. +- Plugin mechanisms for external models. ## Install and use DeePMD-kit diff --git a/doc/development/create-a-model-pt.md b/doc/development/create-a-model-pt.md index 8d2b1494b5..08528cc5f6 100644 --- a/doc/development/create-a-model-pt.md +++ b/doc/development/create-a-model-pt.md @@ -180,6 +180,7 @@ The arguments here should be consistent with the class arguments of your new com ## Package new codes You may package new codes into a new Python package if you don't want to contribute it to the main DeePMD-kit repository. +A good example is [DeePMD-GNN](https://github.com/njzjz/deepmd-gnn). It's crucial to add your new component to `project.entry-points."deepmd.pt"` in `pyproject.toml`: ```toml diff --git a/doc/third-party/out-of-deepmd-kit.md b/doc/third-party/out-of-deepmd-kit.md index 3eb722c040..12ae5842c7 100644 --- a/doc/third-party/out-of-deepmd-kit.md +++ b/doc/third-party/out-of-deepmd-kit.md @@ -2,11 +2,21 @@ The codes of the following interfaces are not a part of the DeePMD-kit package and maintained by other repositories. We list these interfaces here for user convenience. -## OpenMM plugin for DeePMD-kit +## Plugins + +### External GNN models (MACE/NequIP) + +[DeePMD-GNN](https://github.com/njzjz/deepmd-gnn) is DeePMD-kit plugin for various graph neural network (GNN) models. +It has interfaced with [MACE](https://github.com/ACEsuit/mace) (PyTorch version) and [NequIP](https://github.com/mir-group/nequip) (PyTorch version). +It is also the first example to the DeePMD-kit [plugin mechanism](../development/create-a-model-pt.md#package-new-codes). + +## C/C++ interface used by other packages + +### OpenMM plugin for DeePMD-kit An [OpenMM](https://github.com/openmm/openmm) plugin is provided from [JingHuangLab/openmm_deepmd_plugin](https://github.com/JingHuangLab/openmm_deepmd_plugin), written by the [Huang Lab](http://www.compbiophysics.org/) at Westlake University. -## Amber interface to DeePMD-kit +### Amber interface to DeePMD-kit Starting from [AmberTools24](https://ambermd.org/), `sander` includes an interface to the DeePMD-kit, which implements the [Deep Potential Range Corrected (DPRc) correction](../model/dprc.md). The DPRc model and the interface were developed by the [York Lab](https://theory.rutgers.edu/) from Rutgers University. @@ -17,18 +27,20 @@ More details are available in - [DP-Amber](https://github.com/njzjz/dpamber/), a tiny tool to convert Amber trajectory to DPRc training data; - [The original DPRc paper](https://doi.org/10.1021/acs.jctc.1c00201). -## CP2K interface to DeePMD-kit +### CP2K interface to DeePMD-kit [CP2K](https://github.com/cp2k/cp2k/) v2024.2 adds an interface to the DeePMD-kit for molecular dynamics. Read the [CP2K manual](https://manual.cp2k.org/trunk/methods/machine_learning/deepmd.html#deepmd-kit) for details. -## DP-GEN +### ABACUS -[DP-GEN](https://github.com/deepmodeling/dpgen) provides a workflow to generate accurate DP models by calling DeePMD-kit's command line interface (CLI) in the local or remote server. Details can be found in [this paper](https://doi.org/10.1016/j.cpc.2020.107206). +[ABACUS](https://github.com/deepmodeling/abacus-develop/) can run molecular dynamics with a DP model. User is required to [build ABACUS with DeePMD-kit](https://abacus.deepmodeling.com/en/latest/advanced/install.html#build-with-deepmd-kit). -## MLatom +## Command line interface used by other packages -[Mlatom](http://mlatom.com/) provides an interface to the DeePMD-kit within MLatom's workflow by calling DeePMD-kit's CLI. Details can be found in [this paper](https://doi.org/10.1007/s41061-021-00339-5). +### DP-GEN -## ABACUS +[DP-GEN](https://github.com/deepmodeling/dpgen) provides a workflow to generate accurate DP models by calling DeePMD-kit's command line interface (CLI) in the local or remote server. Details can be found in [this paper](https://doi.org/10.1016/j.cpc.2020.107206). -[ABACUS](https://github.com/deepmodeling/abacus-develop/) can run molecular dynamics with a DP model. User is required to [build ABACUS with DeePMD-kit](https://abacus.deepmodeling.com/en/latest/advanced/install.html#build-with-deepmd-kit). +### MLatom + +[Mlatom](http://mlatom.com/) provides an interface to the DeePMD-kit within MLatom's workflow by calling DeePMD-kit's CLI. Details can be found in [this paper](https://doi.org/10.1007/s41061-021-00339-5). From 698b08d86b14d7d3c3176549350f354ee81e1ef5 Mon Sep 17 00:00:00 2001 From: Jinzhe Zeng Date: Wed, 13 Nov 2024 04:39:34 -0500 Subject: [PATCH 2/3] feat(jax): SavedModel C++ interface (including DPA-2 supports) (#4307) Including nlist and no nlist interface. The limitation: A SavedModel created on a device cannot be run on another. For example, a CUDA model cannot be run on the CPU. The model is generated using #4336. ## Summary by CodeRabbit ## Release Notes - **New Features** - Added support for the JAX backend, including specific model and checkpoint file formats. - Introduced a new shell script for model conversion to enhance usability. - Updated installation documentation to clarify JAX support and requirements. - New section in documentation detailing limitations of the JAX backend with LAMMPS. - **Bug Fixes** - Enhanced error handling for model initialization and backend compatibility. - **Documentation** - Updated backend documentation to include JAX details and limitations. - Improved clarity in installation instructions for both TensorFlow and JAX. - **Tests** - Added comprehensive unit tests for JAX integration with the Deep Potential class. - Expanded test coverage for LAMMPS integration with DeepMD. - **Chores** - Updated CMake configurations and workflow files for improved testing and dependency management. --------- Signed-off-by: Jinzhe Zeng Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Your Name --- .github/workflows/test_cc.yml | 14 +- .github/workflows/test_cuda.yml | 7 +- doc/backend.md | 4 +- doc/install/install-from-source.md | 10 +- doc/model/dpa2.md | 10 + examples/water/dpa2/frozen_model.pth | Bin 0 -> 226164 bytes examples/water/lmp/jax_dpa2.lammps | 31 + source/api_c/include/c_api.h | 16 +- source/api_c/include/deepmd.hpp | 5 + source/api_c/src/c_api.cc | 3 + source/api_cc/include/DeepPotJAX.h | 289 ++ source/api_cc/include/common.h | 2 +- source/api_cc/src/DeepPot.cc | 12 + source/api_cc/src/DeepPotJAX.cc | 783 ++++ source/api_cc/tests/test_deeppot_jax.cc | 554 +++ source/cmake/googletest.cmake.in | 2 +- source/lib/include/neighbor_list.h | 6 + source/lmp/fix_dplr.cpp | 11 + source/lmp/pair_deepmd.cpp | 11 + source/lmp/tests/test_lammps_dpa_jax.py | 726 +++ source/lmp/tests/test_lammps_jax.py | 723 +++ source/tests/infer/convert-models.sh | 8 + source/tests/infer/deeppot_dpa.yaml | 5520 +++++++++++++++++++++++ source/tests/infer/deeppot_sea.yaml | 3975 ++++++++++++++++ 24 files changed, 12703 insertions(+), 19 deletions(-) create mode 100644 examples/water/dpa2/frozen_model.pth create mode 100644 examples/water/lmp/jax_dpa2.lammps create mode 100644 source/api_cc/include/DeepPotJAX.h create mode 100644 source/api_cc/src/DeepPotJAX.cc create mode 100644 source/api_cc/tests/test_deeppot_jax.cc create mode 100644 source/lmp/tests/test_lammps_dpa_jax.py create mode 100644 source/lmp/tests/test_lammps_jax.py create mode 100755 source/tests/infer/convert-models.sh create mode 100644 source/tests/infer/deeppot_dpa.yaml create mode 100644 source/tests/infer/deeppot_sea.yaml diff --git a/.github/workflows/test_cc.yml b/.github/workflows/test_cc.yml index 768590980f..b7fd9c6bb4 100644 --- a/.github/workflows/test_cc.yml +++ b/.github/workflows/test_cc.yml @@ -27,7 +27,13 @@ jobs: mpi: mpich - uses: lukka/get-cmake@latest - run: python -m pip install uv - - run: source/install/uv_with_retry.sh pip install --system tensorflow + - name: Install Python dependencies + run: | + source/install/uv_with_retry.sh pip install --system tensorflow-cpu + export TENSORFLOW_ROOT=$(python -c 'import importlib,pathlib;print(pathlib.Path(importlib.util.find_spec("tensorflow").origin).parent)') + source/install/uv_with_retry.sh pip install --system -e .[cpu,test,lmp,jax] mpi4py + - name: Convert models + run: source/tests/infer/convert-models.sh - name: Download libtorch run: | wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.1.2%2Bcpu.zip -O libtorch.zip @@ -47,12 +53,6 @@ jobs: CMAKE_GENERATOR: Ninja CXXFLAGS: ${{ matrix.check_memleak && '-fsanitize=leak' || '' }} # test lammps - - run: | - export TENSORFLOW_ROOT=$(python -c 'import importlib,pathlib;print(pathlib.Path(importlib.util.find_spec("tensorflow").origin).parent)') - source/install/uv_with_retry.sh pip install --system -e .[cpu,test,lmp] mpi4py - env: - DP_BUILD_TESTING: 1 - if: ${{ !matrix.check_memleak }} - run: pytest --cov=deepmd source/lmp/tests env: OMP_NUM_THREADS: 1 diff --git a/.github/workflows/test_cuda.yml b/.github/workflows/test_cuda.yml index 996a1bcff0..4dbdc5acb9 100644 --- a/.github/workflows/test_cuda.yml +++ b/.github/workflows/test_cuda.yml @@ -19,7 +19,7 @@ jobs: runs-on: nvidia # https://github.com/deepmodeling/deepmd-kit/pull/2884#issuecomment-1744216845 container: - image: nvidia/cuda:12.3.1-devel-ubuntu22.04 + image: nvidia/cuda:12.6.2-cudnn-devel-ubuntu22.04 options: --gpus all if: github.repository_owner == 'deepmodeling' && (github.event_name == 'pull_request' && github.event.label && github.event.label.name == 'Test CUDA' || github.event_name == 'workflow_dispatch' || github.event_name == 'merge_group') steps: @@ -63,12 +63,15 @@ jobs: CUDA_VISIBLE_DEVICES: 0 # See https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html XLA_PYTHON_CLIENT_PREALLOCATE: false + - name: Convert models + run: source/tests/infer/convert-models.sh - name: Download libtorch run: | wget https://download.pytorch.org/libtorch/cu124/libtorch-cxx11-abi-shared-with-deps-2.5.0%2Bcu124.zip -O libtorch.zip unzip libtorch.zip - run: | export CMAKE_PREFIX_PATH=$GITHUB_WORKSPACE/libtorch + export LD_LIBRARY_PATH=$CUDA_PATH/lib64:/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH source/install/test_cc_local.sh env: OMP_NUM_THREADS: 1 @@ -79,7 +82,7 @@ jobs: DP_VARIANT: cuda DP_USE_MPICH2: 1 - run: | - export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/dp_test/lib:$GITHUB_WORKSPACE/libtorch/lib:$CUDA_PATH/lib64:$LD_LIBRARY_PATH + export LD_LIBRARY_PATH=$CUDA_PATH/lib64:/usr/lib/x86_64-linux-gnu/:$GITHUB_WORKSPACE/dp_test/lib:$GITHUB_WORKSPACE/libtorch/lib:$LD_LIBRARY_PATH export PATH=$GITHUB_WORKSPACE/dp_test/bin:$PATH python -m pytest -s source/lmp/tests || (cat log.lammps && exit 1) python -m pytest source/ipi/tests diff --git a/doc/backend.md b/doc/backend.md index dd20193d58..5943165dd5 100644 --- a/doc/backend.md +++ b/doc/backend.md @@ -31,7 +31,9 @@ While `.pth` and `.pt` are the same in the PyTorch package, they have different [JAX](https://jax.readthedocs.io/) 0.4.33 (which requires Python 3.10 or above) or above is required. Both `.xlo` and `.jax` are customized format extensions defined in DeePMD-kit, since JAX has no convention for file extensions. `.savedmodel` is the TensorFlow [SavedModel format](https://www.tensorflow.org/guide/saved_model) generated by [JAX2TF](https://www.tensorflow.org/guide/jax2tf), which needs the installation of TensorFlow. -Currently, this backend is developed actively, and has no support for training and the C++ interface. +Only the `.savedmodel` format supports C++ inference, which needs the TensorFlow C++ interface. +The model is device-specific, so that the model generated on the GPU device cannot be run on the CPUs. +Currently, this backend is developed actively, and has no support for training. ### DP {{ dpmodel_icon }} diff --git a/doc/install/install-from-source.md b/doc/install/install-from-source.md index 4a0a104b7e..0bf6fa5ee3 100644 --- a/doc/install/install-from-source.md +++ b/doc/install/install-from-source.md @@ -297,7 +297,9 @@ If one does not need to use DeePMD-kit with LAMMPS or i-PI, then the python inte ::::{tab-set} -:::{tab-item} TensorFlow {{ tensorflow_icon }} +:::{tab-item} TensorFlow {{ tensorflow_icon }} / JAX {{ jax_icon }} + +The C++ interfaces of both TensorFlow and JAX backends are based on the TensorFlow C++ library. Since TensorFlow 2.12, TensorFlow C++ library (`libtensorflow_cc`) is packaged inside the Python library. Thus, you can skip building TensorFlow C++ library manually. If that does not work for you, you can still build it manually. @@ -338,7 +340,7 @@ We recommend using [conda packages](https://docs.deepmodeling.org/faq/conda.html ::::{tab-set} -:::{tab-item} TensorFlow {{ tensorflow_icon }} +:::{tab-item} TensorFlow {{ tensorflow_icon }} / JAX {{ jax_icon }} I assume you have activated the TensorFlow Python environment and want to install DeePMD-kit into path `$deepmd_root`, then execute CMake @@ -375,7 +377,7 @@ One may add the following CMake variables to `cmake` using the [`-D ==oFd+!|; zN@-{pQtEfz_aPKLpU3lh{a(NS_wPK<-F=^HzQ^^R*L5EoXk6SJ9K5_7e|*MpjN&jR ztoG6^^(?H6=;rf{^jZ4zrPP)VytzEeNGpkbH%TJlFbrd~j>a&M*Wcin-wPZvYD?$*8#wS3`12lh-pTpb zbKeT;@BFg;nx8%Uz`p|&7@)ua1qLWEK!E`Y3{YTz0s|BnpuhkH1}HExUIfpv-B}j>$9+aSW_fYe--Kt268R>|K0;?-oL_zNauh15b(p!j zCIW^RS6-v>TmaGM2PQ`ezd-9Q%x2cM-$$tdb5$Skl!9bV;N;v1W$2lyQ=xz9BP11j zoy-4b90;F%Y{AGm4H+Y565oq3K5`r4L-!Y>rR`5!xwmDZ9}9VfY$0*z%pu{qhkhA~*ZDd6M)qAaVQ87lxwJqS{bSAHXNxk>>^+kk z-NJ8xh>UDyv}Gx%79PFQG~WwS#&|TR-pPX+jZ3Axnep(Tv8{c_{%DlB`JKgwX{qRt zCNaA4-V@lv^XT1_FD0P*V~Ik=loH^#@Vq@g?g6auT`8Y-x&}0=&K`>%k%AhhS+Cvr z>Bs69D&oOcj_rlO;skd4;Rv|n7N4r!W z6ho?K`1zq_chT$G@ys8aE8*qQkRkVY3(?U%2fs#4N&(Shqi2eh7Qxz4ru#1*sX<5P zkJ2c6kq*~2c--fPX2PacF2_#_nP4HO8nGdz6i&{H7MY{^2rifE+Q*0Gf?Q#g!w|&` z1doQUU2-uA*{Oi*0f$nwr!;i5ZKxYk@fE7Pv^f_ZJmgxKCZCE50#rh$tV~2#&#W5x zdFmx}ikT-sj7g&2&n6qSR!0kxFR!y*GM*!eltHl#oAkx8{E^qconNVs`M-==TO$AA3i`Ze zmQ!10Il6tnbmx^7J}^yTyl!N3F-n?jdE$&x5tN!(Je1>&Mwj1OS}$l#dGwj@tqxUNjcT?=*Jt?(_177^dE=flG5hHF@Wj#gCJ1$zbKP`vl zjwOy8b7P=Abxz`;8TxQzq2u&X3yNU7?}@8rg-qi>DI4;o30?OE;bH&T~Daalf>s~WD9l2f>FfWjg10{RapL1!kAQc~C#)y87kX4+- zt5vx$>oFQW;b0n)uWePu(G23fB#wxM=}=b03SN7-4vws(r5yE7LZ5f6IpL@G5IL1J zIvy2%4ENo}ZyjoO1x_7n@pUz*2dx?5r|(H8qqf1bKUl5~L<)xpW1GdLC@WBFh=^Aa z96mhh++u!zu-{{Gyi6$%j1}F3RI92%H)_Sp_h|=_b6ecz#>wTtMQm((ys)04&&`)6 zKL5;CD3fB41t-uTB}r@fCevNt^O3+{Z~@a%h? zkLBpKKR&S2y?=Me2c8EgFhGF;3Jg$SfC2*)7@)ua1^(|-fb?tC$1^{1@L^o>^*4WV zac}-8PCzZ_=8yjFU;op0as3r#-g$+{*w|=jg=p3v_ksEW`V6d(0r~j9svo}nyrkux zm4_mVuBr*G%J}0xP(MJQf%P#UAOBbN1L=PriHSYXZ~qf-F8&w)^Pl!U$$ApT|84(s zEQe5UJ~H0?8Q+JGJj;E0+M;KdQF!y<*2a)WpkukUdc!pzB)}@QpT=FshM{OapNC{M`<4dRV?3%tuGDl;=lh@zk5y{?YjW@bx_d)C4Vv*UUI~FiS z9>Q9_+hYR;y`|<4jl8P=&%ZxAmZR7C@kY|Wncw0pZ^53*SFlbozI^eDY~*++Gh?&O zV=%kFcFD&LMQGusZ^eU~i-57PI&1UHQdIf@EgD?%5Wb|AI;_rO@0-Ys3|*;;*C~1Z zjb6RQZ!&ma>A%R&6TOsLy`xRmxLc`UYsY*Zk{yg_E9N`Vmxmx)q1s?srxK`pm@2&T zVg$0^RT@}!`2l*YUTOS#rXSk;IC@BeZw+v%dl*HWDuMVr?Tf9Jm!jgp>uBqjrzpL2 z!h~zOk+4Ti3bj8;hC2mYCB%kipvohU-{laI$WiuHda0!?vJ;G(Vdj&iWqQMd!6MhamQ^C=k5M1C-St2%+nUs;N=2ew+m=OMM^_=} zIp6HhVHMPRJ+fi=zRp7&f1_`&{KxxJ|AqgvvgHIG&8;9JvK2P;u{Lg{?t%3cmf&Hz4 z{jLA2`&<8{-v;)#2KKiG_O}N1xBjp0Z~c>g`>*?7GXL@X6}i9lPuG9l|B}IbbbalA z@ysO-5pT~zm0$FBpM__^ZA^0%-SHlpmJsrzO{}EBzkq9c!10*nR(iMXGHHgmXo}RsBV(@JKMaxXbX~Tj48kXqvE_7?A*D zT;#bwMVG_EE!M;Co85w?I+tRK4rIc|x>nb^YoWmBZ&au9BpZ!4-^v`L90N_?=SnxV z$3pU|hr-k2A`xf$qA9K+5r_!WeYR~|9vWl!@_~h@H>{fa(^jr39G%H)wpW>xgTB#+ zR-7=*K^GgNwk3;Kz_;m3!wMblAdkzZ;*C7K&{z|ZWjpQ%!#C9^H8o}wl=C`l4Lz3z z8OO|5^6!pCANL$uctp(!R%So{Caw?z$BuCf^H>%FXNAtF%AN9tn_07o!P=f6wl(EFgEyWpeQJbAiNK7>3RYs)#N5X7e_u{QdjLaN5s)IT_S zg2|pqGe4z-LQJ{&%VyJ9R6XAKc6DYDs(7B~;-3@?FE1n~eVHACPGk)iY4Qs|`{&eU z)ZaS;w>7qYm@y;-o(8^ROcINPow?}-QhTDH!uWyY0rw=WCFfk=Wa}DS*Ci*2)_~_#mSg(Wzs+!_lagTN_hnv{&Hr@b%!GTI4> zB6xPKT2=#zB@!yzL-WxJ^-0Thj(bADC$Th+Z+9StF;wpQmu={=NyYVvg9AWODI`DL z2fSuIend;oM7dOVJZ4}~?e z5@MUp^UzAo1LfnNCZNXw7BgnG-A9eCpF%BKt|CP)$N3Y`Np$yAqDsrTTr{Qq(bZ*J zQsCeZcePTegwu=&({Tx(`#5M|DPe!EE))W5QCU3RPlX&!5U*RHWh%|FfZ z%QXYE+2_4_+>{U)tGH?X2=z2HU)1eN#gS|{Z*^wKo@K$Pai_`Gye*kXIYN$8#V-T- zhq+iByApvo@{^<&8Q((}Sp1rGZV_v!yj?`aps6BffFKQX2IvDSt;_F}UpW^ch|0RF5X;jWD zX|V=WvC`q$;N7KY%8BY>OF4@n$6V0ReDZtr(crA)iKS;KIA8i&_uGET_VNC!fBnzt zie~vp&EWieIV>k@Jl&3&^1Xy;_n+1xTOK2wP@!uxYokHo?jt6B!CiFZjhFW--ats> z+iuqMJ_KoQ+;=YEVKESSdKtFG55O&)J96-)YSb97ny}M8A8L+I;HsDx43EdTIc;{y9TDhy~RH9RbmyeG~V!u z?VJGgX7B#*v5*S;OaeI_YJHIEx#RL;lKF@u?&%SRa|uPC=Tbrn{eAycwx936Y6@z% zuD?`-P7FVLN@e>~)KnVWtbEZ9hDa5>@(oWwQk>1p({vgU=>yKJkW%fh|0CPS`>zgK zidPirS;&6%or8rE6-Z}qYty%wGO#zvF)8zSgsxxDdyUH{Qx0~9Ww)2gc;jyex0|2hk`9u_!E*-c$^aXZc!MOelh{E;(lim3SyN*D@1G z%RyrTUIl~|r=ta}s}jV7AEAjUQyde`9>9+3Y0UNhcagkt37w_Zobv7bf@_L#Wrk_&o0tFhF_@))RTCaPZA?+pdS8k$107sbCLlZEa3%|9H2 z^~S#?meV#zYwd?Yhl=0pavejd@506BRoI|4H(+%4BRTtog+C={*TDdoX= zHxA6oBX8eV3J2p?Bfrl$5CFKgW?|n;$b*k4qEw2=#<>$gg_aBOeL9cdvveSq|vo;9~a~xF+;);iC=B|qb z1AZUljM4W{;rIE~n-?X6qfpG@5WgZ6pI8^8KQjkyynT06R!kPyPi=?gE4|R(;R_sR z+Ic_#ame5^M;fT=WGBC<4nx+CC3?qK$HNcFS)PYC-v==PJ*`VGo#0&kvy-i(y^~8KoLYiv5lXeJrg=;J|TyzU& z*RI$IKLemCiGSe}^?NW(r7CAiZZeui+kGp?J_PDyK5R1yjEC@7vmZO!5QB7qrNcR0qxee4@%5PhZGuH}IW9utcwa?J3|48E+o4EfqN@KR>l7#TQ)}H>UOE?i6tP`a$XZ_Xv19 z){}esoG3sQnWMkV4nPk?w=H-%B^5^BG@dZXH39M+wDz`5&P9G6i%*`}8iGPK0+ycm za0cwQskw}toDG7N-xtg4RifmDksB0?iqWgnC3A-^x{NGM)*pJU7>IUoCJh_*rWjok z-{T-UI1UQKHN!&aX+W>JA6GKD2zhR|sIx6df&)iXRbGzGLtYQ`2Awp^gn6s@b?)r6 zMay{vzc{{$f%Dl?s)y)>$nK&5-&Tv8$fo$*tiY=gXqS!W{=$#@kk7;K*E}?e(72Yc z^^G>VU|aruEboXg@c5Fmh^sOj1<6L=TgVxUc9;p&?FdUpD_GhYe^hBBY1OKH2$5dykWyM#s!w3;Gz}cb}Ri+K=4hbj$9~8$(}V< zVuCM>*v|JnVR<0v%#2vE#_Ke^ed0WE-j71Kh-7(O8$7`Og>l-`FcvyHIdtK(gSt?V z5N~z#Z6Ug&N`qM?NigVox{lXm76aG_Pgd6Kjb zERUa{x=`2?v}-GPSR<3rr1k2u&8`0ES#kWz)6(AHBzbbp3CkQ<8}%lUKdTtIO<#Se zO|t?uAF3GI;vWs$#y@=>yEO<#j975~qZq)r6;0+%BNO1&4G$^FOk-yi3Tw28G>ArWHL+7~w)L1Nc&p_dOD z;Kq__T4r!H7^tifIe6d|Wk2`xXV~=De#+tarZ@YUyO%cnJQL8`q5hxeDCfW;?d$wWKOP{vF~ei*J$<0+^Xy&2!|ou- z0~PKUo2wwJM0g@|VgV$tyKrYl;1kf)zd7N^(n3h4A4*L9k&K-AgG^<&KLEoL{R=AY zs=43e3j8HzsvbXi@8<>tHPHU6ov#3$onv4&69Y4L?1e{P?Jxf@XaD z`qGo}6!{)FvR~ah13jaAG;dVQr1ZAH-#?PW@l}8PPyU5GKaMVV zfCjhgnrpcf{S#r%Hr563sX@o$iv*o#=( zQjid-S95rf49&m%o<5Gt-^p zpHI4p;M?e78ykb*NsXqr%=2Qnq`c*zSzFV)TnxBRa*E>pcjVlHllTaDqXAjWWaYe&ru6e_kptSLKHl(06Gv1lT zoGOFaXD#ZUTcp6*Mc-<^aONPf>S3mW7LiE3=;yY~3C}6|sHkz5^_zb(gQlJC%3ZW_pNEw!}`rX9N+ZDzmgdz z#!Qtt0o=E;%5D@sM*^j%Mp^`wgNn$;xz>l15IyY1b>CwdX#Tgi-Z{LPut96I%levF zn0LYHOWW`aw5(O~U6xoK64$$bGR~t8{AvqcUrV_PRkyclO+=K*lcSqZx3+*+q{EP6{_SxC+U}y4d*WgAJeL`P0@YZw0 zY4M0NlL&#I-`_PJsY*h5mGgZketLq2%|31-s9lAwCaelX9DbC3aunHO-EaQk_^Lnr zYsj_vAsKoD98PSCT6vQ|Q(Gfj$0Iisw>8aN`;im6Gi0`cdd(?nea+hP+_T^O>m&Z6 zS!)?J-aU=hR-WORC%OvuPT?DWQI`eF#T4969JED>OIMceTDO~`PgbbN-G0yCNBs4~ zYH!2L!AD?+nvI|7OFLN9u&J58-wXL=Xlvx~j7OFG(kD3zxKi^c9B`5A_xydtUk3wP zXVgt`LK2g$z6w|~(aCr7CX97)L{6<6MlPO#(4p58qVL^1Ma|D;KCIvIr+gpz%Zp-j z4quNtk8A@QcME^chWoR}j$Ex+h~n&TmMz&Ci-M-_TJ%NaF0!}3qU53G4XKWv0>|RL zP-caC#oXJ;pd9^0X<1zy1lp8%_(kTSx}WRP50OVFYlm(7;HNrMgIqjulrk3v%Fy0yf_BKSG_>9}H_Y_xRYx(m7j zS*TLmY<<(A6nMTx=Z^37BBV6;ofh;?tn`avHo&h zGIII&wd7(=5!!m{WYyAe8yue=JR9=O7N%@@Ec0%#BbqQ?@1^ngK*%=befIcP68f^~ zFt6&WGq5*%W6>%{caUm5_`+2+35~DVU%yDp3o@N9*W|gRB9E36aLqad5$&Nnho~l^ zT{#+|6DJ>rX}VrkSA7D}zCq675lKO)e3qe8l1?#bB|2UEY>@;jLrzCOlc_|dhk_57 zrk_XIHf_c2842iHQ+48vjR9ajarS~UG3m(5UwFe0p)h#ISMU5#G#?GsXi=W0R)`kR zFAgfhasJB{tv+ts+<`+=CevHb8$nZ3*@>0}n6ZD*Fr`arC}@km?@yC56jyL?^svL( zuz%^6rI&Q?qPTC9vN7@lglA z2%x9VpZs`wDMS(#E8cP60;PMa-i2(70BKQ1d&{v@aGAaM!pKxFBr`;*JtjX14pzs{ zSudS|yq2{4EZrLpla4uF+4=Mux;A#ab(Q~B@IcYyj+#ZIr$*beC%Pp-_|uZDGN;lY zljlPFesy2utzl!JzOMv4ozpJpB>5qK?TSwVvY}{^fAEkAXMI7#$XH1&vK)=dp0#4h zp1UYNvxP?coQIZ;xn{PaC>T9%oKk!a)F zVbhO3FM+_h(T3ob2Kzad@7*^%8x1a>KUv@CCNh1QJ+;*$7aY_Lx8z^Hhuj`}aY}pm zL!glV+yuUCG}$w7x!(8$RQ+u3Hzgw`9NHa!skR~u^dwUKOIIC2o-L>6=mbWBvCiQ# zgD5Z1{Z_47QVQH>reUbG+c>AGLl@S(wZ44=-|4ei=F}! zv>KxodfOj`^KWpHei9Fj9)&M9mSrHG7w1o>+>1tULht^RNXdc+YKH`xRu{n>H0|}$ zy&-7Byp17~M6yv^wC7ZX(S9IxWNMZ6^%!_RHN4>Zn1<{ z1gifOa9K?v9XM>}UlrC#fohGPyTf#gQSw)Z4_85|yY8T{|9nmJ243Jq0Rs}lx_Ws|?3!!!WjsN6vT=ie}|73-xSya8c4ek3riA{R*9jxQh8+7zJRCC0SPl~xx z16$MAgHgoBB18zgmjHZ?b~#w z9zC5jnpur9P~#$guBT4rFl!;)OUH59rm3zg8+npo&xg?r#& zdc~` z^F;1;{@ON^*}q>bch%-jRzKrE`F`#ng*hGmQ1m$uGWq3S&8}}lW>ZfOPdxh?S+6e$ zm1n#_%!xPe2kS;6a{n)6iTk*I^RJKnqf}|FLYqSm(T~E!jqXP((BkD8L-dTJ(Dys{ zWwtiPqCwM~>oVk?gXV>n8{?7+;9-5d{u<#}$b4vY^}cBqN_jr+@p$1J9ZLg42PEA1@zSYb~dtQZ}?R)KKf29$otGuYon^}eG((klpF|y#;&yR;EOsobY zp)JV?dbwy5x4xtHo&sup`;V)9(Qp3sbN@)}o3_TdH_k}VFi+y=mffg9us!Ulsym3V zZdeQKJdE0f%2hZRhbjKaUON-lZ~pbMe>7)~`E%VHUNBX|JJw{42M}{c&wIMt1vx!t zE}j{14vl%H-eijNGvxZADTnvlf0yqgezD@>@(Ud0406gVm+LziLF$F$VvpaSgyvSW z(3u~lKxxhQtO=pVDE^Gm43+OU{(ZzR@_Fq+StIIT=9ML8Q4MuaI&AXY#OVQ`bM5%O zJcpZbes5E4`pil&*~z6pU$6*1-=AwxJ1GLSE<8SB^1I83bNi*eHp9aqVCvC#2SX3T zXyf%wiiUZpEOM^kc?0~r0>Z(xqpD?a`pyp1B~B?YDba4_i>yEtb$BmF{=qPcu3^); z0uEulL0*5$8};`7zx;nZ|FP|D?d&g#Iq;=q<`;*Vd9X&ic-`kQ#UQ1y*k@R7CGs>j z@!eJ6j575-9-f>Z3j!}{TTWL+pjG>Z2pMvhL78pfEs;tu6tOQueXDZ;3X}dAwOKkI z?!6eQQZdO8J!yBH^0_b$$;f|k;ZaTpQQsQ|EwQ=qHYnvu*4YYp^K z{uP->uf0%NLEaiF=HJgU;K)GfkE1-I?uMX~Lr>Zt$Om-xluzorfLxR(dt7XgXdyg0 z$MdlR-F;(cwd%rnyB30maQRc!&%?faR z`Tg3m%uulR8gxW?M>-lh;Z$Sb1Uuw=HKE?C@GjEOUcFT>A|KWzX=eR!DS|tfTsanJ zhQW8^QA_r%N=2XBWLiew@<)P>Hamv2RwC=1!xDuJmmsLzZ}6s7#qc#wsZIP$2`U~Q zV)ZDr0;YVE6As&032kqbmW~YdLH>w$Lga}uP->MA7_FFyIFD^3(C}1Le(_v`Dac#&)}kpzv8ZI5#fW9*rLZ76lgC0i6J0scU?6n1 z1V%e8TJ>gdAxd)}-Fz@A99gdzujRR=7&aa&vwU#=GGx!ZQMDlmpJ%8Vbn}sxBbu|A zQ8-Sh3cgyMn)2aOA~apGe{roa8M!YWn_?<~*V(F>2lkAwfKT6y)v9(^qEj|QTn4Kb zz}hyh@`4}5V81?QJX5^_mYliAryG0>Eu;ybTDCt8jr=6yxmL6iDc_nF$mg1hYFlK_ zT;lgd5mf=EZR^5OdwAW&pWCX@ri|6sYz}0@mt-E?rlnQ1j|vAFZYTcyK>-osECvO zic~aY@A#L(E#*-5JcPvUM) zL{>2$hOc(R{@JiI&DDXp-@PH)K^sfKDSCwVN4W|(=n+~y_)8TU7PNWBlXdCH`Icst z-0fg!a(-<6ZvG{daen)?pC^(*>2BN-@X3P@PsEPwkjX?oaT@mNxAVZQa_j@)N-S3& ze@Lh0$D&87lMTy5{n0(|u{-3)S3;{zn?v!I2k2&mo(ppYQV1&=@Puga3X9zW%1Cd;9wj3Vq~{u*&c8A?@sDT3l0q zf4@ip#{>W7_lr8;9U$jD6D`Nji=iQ}zv0*0{)Iw6_b=9;ZhewtSb~mcnCd*2%m;%l zk52@(N1?BNUYd+&fe>^;*-`3b8tCRMj>;Zf2Wxosgi~xDfay&O)%U4M@a%==iXD;p z@RPQ4wm$y5K&CdvvXu|=5nV@qgk+otYR)q~Qb;5tH(i%~D>Mp_GON(!Rhbpu9;>;Mj7X=a<$d!A;BdsDRO>&_X}hu)IDT>C_+e z+>x6LOV(X>n;w$^W>1uVmb7KUwZ)@KKMNJY=*4HZ>)lR8UQN@Eo3>P;sdciCWkwXh zsE~8+IrU*^@S!}$6dhd5vsc<5Gnmx6JQWy_qxD)3v$ zyY1<#+Xw`a^qSS_Xl${x-E>q_^El!(Ju_^a+H{> zdSv^`N1(S#tRUymdo+2ic5U0w2B@N4I{VOw{kviZ4X$tRum7pgNBp!?lFx75o+P+6 zk}p-rGZx0Yv3{_QqY8E{8Izt6mkE4lHZ9{Gi_dF#yJ&8cD1qEt+dd7Ayn}*-$D(}~ z%aK>0C5>y&J#;)|1Z(7*Vwf_`-JR8(3N?vME0lBVk&e!y@$(w4~~;aJI}tB;G<>uItwbPjj6zc|MdOn+Nh)%png^iTwzUmz;=zbH}v z?rkFCm|Z@N}Q@IIUl2GAC4ApCvwrZ zOWucw)DuW>`H!(h-tz;Rv1s+jX`_IeKkb!}ZGYE~Vjup8^HkF| zK7|5UqBV%GX-6iCm5*1OErmP-HShX#B5@km^DXpo_v9?Oa_Wa#Nh8qw+2 z7DkfREJ+J1Bf5FVzjRAFp+^<)t-y~ad)AVbd`u3B!w%xwBQU@grj~k^23CZgk*N)f z$!SQ9C#h%4GBvm1(~lm^|9}%@7VlTO<7iQp~|LPS!@|5E_R#OPu9mXlP|_PB&zkT3Oog zttX7=1l?%4sUeGx$t$smwTU@Yo1`d<&^NU-wKQS!xoD5a-}Ovw^o(uI&GiiQ4R`I< zCyewMR#v;1!`5k&ekX;io)O(x&&H52wPrDgYd^&R>=R|}v8L-;=v#{}n5rYXUUcqM z(N&_l_+KMByP*|02^LU|0--PS-QAGTNiZ9$b!`x?5=nNOBZNzm<1FCrd$RYeU!TYJewU5w>)4 zFcL>oOKV#ewQR`Q4XrE<^;zWnHguMrk-nXY-d;Lk)vXUnS}T0Y-p163j*E@;&27lB z2)d0W*@L7~XIa;rU6||0%$+JXcdC-E1J%je*ov^Av)R!DA@WO4EIMdRk-^eje-E9o z!E?#tVN9euI7O1xM5fypeHP17Mvq}?WJD(!LXn*+vSiTpjc^GDMU-qL{bwU-y&jEv z@Q>_fYi*>@qU$kax?$W=h5=&e+vs6p+TqF$YWJ)&AqbPc>Wm12gss^q- znn;^S_gUF{PaD=AbCQoF1F;6cT(#9VC;8t2?yn+psY^-!S%DW2B{HIxn3H734w{qT zVES~!1Fu3GCc)CPw4|GM6=PaiVOIB~RY#$PIVr*&bTBd{u>PP_7cT5vWB(vUeXU|r z&*)H=Fl{L1KmyxsdbYffg`^abZM%lE z#_*cjVEM*HSoIj|+nTc_%fiZv(j6Vs((Mh+ZH=&qV$mXJ*CF)<-O^6any_NARVFUQ z)W^k?f+PX&nue5aI)=lzbNWuwP-0I)Z(yoVj!Tu3Xc?QbSXjwop=9g2Uuvnl!s;&2 z9e~=<=_GpOA|PSKj~GlWy!gANt%ZS}v9&&-PijmOQmRD1d&xhrsxNZ&f--^8B_SdC zgs0MHSy|{&kaQ4_#GE~~9$tnP`Zl|8<6r1wvDMeJVd>+QXrRwBB(=CS32|3>2jNLf z*lV7uBFU&{X`^ppO_87KW36vW==I7#Hc-8>79&b7OLEnBaHazf8-k^8phqscj`9w= zcM==JY-xmzpr`|Lg!V{m0DqATONAkeIkLl`o0+mC^{h<|cbU`q@LbqRvlo{hOW%Z# zISM-iq)j(Ax6)@xD=?%VOxk!Gynf8- z%(1vF`PGQ>2bkkZZFvi4ggW~b#PQ@eZGN<4{Ct|Qo%&iRc&GoEVdK8RZgENIO zV!}OIP|nux%|vjs;kX&eds9QUFUFku7ssu8LrHQ-lRbLf%lMXWSV5I8p+@X*=%!H) z9qBK1t|6u<1G{PrE(Y5ZlV*xB2Ga&%_iH+Kzi6DaLD&})C;!EF7Y5tonn4kq9KnWV z#GKh<02$`2jse8`9zcS@=fc3Q80ENicwEfcj8VGclsmYdIfuHhV$P*&55>T)!A>X1 zN?qnWOmMP0mp&cqN!)*!Y<8;=1BAb2^I+9VPF(=zDCK3KUZ0 zLTB@csYqv#IFP)y(6^^V*~WA)ovB3Qq`Pplnxmfs6K7 zvdM3CBs|Q8eL~E3(b+&R!a$QClYdyNYjmc{UzS~0GfC3-s`P{(hFk@jwpfSi zP~yWDY+dG(jx|9!e$>EA`$V6uZrJEA!|4B-vD-t(yq(M>y+<~@%NZ1##c3U^?!>Xn zhB8;UP~lP!1Iko$VNi>kF^4gi&3*xl&Yundb0wQXzf==*6+?)vG%3T+T-1NV# zJkmz9@IvlfeM`-)40mbJmr!L)4NAw6cE^IQZ^_i`p`K)!n;C=G?&QJ>ZVRcO2GPuE z+${06!JIViZW>ODO?4Lb{_U9BJw}jYZtWal+h0b|Vaq``5;3}n!d5<1u*clarVS4b z|3@x4GTJsaHD}?7ob6pPb$@Fy47cbO6f$>UvxT`qG4r>;jHyRW#a?R6oz&nx99yQo zGo^(|*PCLi0qqc_52ykvR$>~`*b9r@#)?HSjo9myDjzU*Xxx$$YZ1bpP(-{CVOuPI{TfcswhDX|@u*$9?dJYEDKAxE|}w zUC!DhEm(95YdWFNvL)zD^K}d?BqR+<)&48oWLmf|x`_#?eSe7wcI26s&J^PM@$a47O}SP~61A#tyZacC^uK`M3BLeUp;7o5oL3zhl*~16*vH zabkmM&o+jn&uYWmvyOoUj&!r=6xa6lDsEIxN3zp1B^&Z>z`p7VwnMs>{Lb9hrRhns zu=NhxkmJ>`pDi$KCCsCEW1wpKfnvcbS>kF~72}6dYr6rlW zvo)vNNMh+`;h>aG@L?|xmymXnkLlKh5~kh>e4XsBTRH}I?>6x7xj`J{?Y1IzN#a!qb>gq^|Gs>^l0}Fg?0W(l_*ydYx%X3w<&~(39?g&zUZK z7(Cqu?10+Hn$30g>g|}CZ^b%3=Gm@}lrqGbOcLI6G=9c!x|dgo`IVgQ&VaRRHmo5tSA5J%6x~Ue(n250xINRehka6D zUdF<;84K4HQn>hOJXpMVuz)#tc<)yk=X-QeWM0D^cyNd7WCyZ&SK}KU{3JCd<VxHjRKgtwfv#t%Z$W3?#N=JY5MYpspH!Zv zMl7Z;Tidd82FzO>)`)FK=*-*Q$lbL(**s?Fo|pVGIcivr?{ra?ZN+}oGW{4PSO)y@ zb(bN=poqxmNjW9vJxqv+m=FOJA^xD;{og33%na|4xuMK1)QzNo>l>k z6T?*46DBgX#Vlg!0h(8jNT8b0<^EIM{ z-5&Pc?NJAcI6~?OZ?XHYN@`L3>9jk8@Jzhe=Vx?y_`klBv6UWUCqv(vGD)OofORHm zn!21=>?>ebx4Tm+P7c-Kj8e}X?kDwZLlbAPXkHBLLo%?#$gp3>!0zB)#&4b+qr-P& zIA~MYDli{oK9a6lEs1PTSFMggd1mztcLwDQFnag^43Ga!2mHdi%liIJ2XtnuDDV`S zPcV3*7`&$>c>FkXMJ20#8M}tx)u9se8SX(QxSmto>#^_~yQ@P|w+#9pb@mIqhF^Bm zEj@r#X1>Bx^5Q99Q&Uo_jEpurEppRuK*~rl-{2nHxW`+v2e~S{TEFWKKvIvu`}?+hF!>2)~wI-BcTb7nl8SI=8D+52d^5*I0bSP&`;K zs#ivq;KMZ?YLpm;pV@-ZivlKwlP!DdU>P}LM7RDU|Jr{P*^&xM$XrY>%9xB_Dc_at z;uGZG^u)>kPKDW#yZWng-GOBgCsIhCoV}w=@RNhEH$2$e%7g&BgtT)#_j7UhW=D*{ zwa%0g>{&@}=n`Z5s3doSiE({YlF1ojJg#)Kd%FCo}RCDn5RRY^v@9RM+8h>27g zX~f7Tog3eT5H7~JQfVowoZ9^+CXvP5RMbv3@0b_|-o#{F&eUJk@kPjIx3FBQ5GSA>;4QT zh}mTEKUsMhd14OPjxzMbT>MCiV-H(T%p)6+=AMwmPZU^qVdIR55iuVZ{6%GSi(>x> z@n!ga#kGVK9)?mDT~Qfn<7E^GX>x8VL?vYKBMBTQ?YFR&kR=;+MYdE|MMAEtt9(b- z9sw?)KsI2j2P&fAWJeV17@bZR8K}AZ9;mTX0yyWQPY{ZD1WXns_Dz`_ub){0#qL=G zVgVkBq6ZtgUUDA45(V8-UB9$4J9WhOOC7Vb2gJf2qnh7hcKIwGHXVPDi%sJw)Qn+tK6OfMe)^Yof##iW|UN#QDR7mINrWD zqt3#Z$Pg-cuywz3;W8%Vu`psWRY+pQ)@c?Dd|bfVd=G)B3UYIUU14rPsQ%WLZr9Ov z$*;C}kSXS2HTQ`Jch_$$& zFN9>Jh;`(oRBDD;j~_{d@NNlqIJ+aXfo#+hAz5i+BfBe!(5B9=-91%8gKW?Zp^j9| zKPZ4sgfww)jL>F$qZSZW?l|#ptcP=^#1>rGCsHzm7CA8+DKabGJ5pQ8M!z8?OKf9z zC6UtU?AimV?PP;~Bc+RbW2AQA8b09S z*?>*Z0vZ>l3=Y-m*QiN`wtr$3}>SAOA$imTb^D1x_XrcDR6=g3)b? z-MFxS#Fzh_`1W|HZsxOqMsj=)F2uLJ_{I=3`+wgSn*D#!@R?DD&Wy5bW|SE-qb!#h zWv0yjYMJ(7LYn=}8p$dX`$=N6t&szMB$vjY*60A)sHdKjlOhhXyOLsZsH1C7Yjl`w z&`lHkJ8N_V_r|Ni5#P-IW`X3S2`6$Qwz58oAA8qJ$H+#%At6H?XLlu$aPI8dL)Kl$ z2HlYOcNWMM_r^%L;hWjtERLKkae|zPjl@a(*gF#LWTW4ZkRwj9yOKzp?(EtF2@kSC zzmYhDdt)Td;+q+1W6b)n5OVUwIdUR466f(_??_xA8~qKMf3gr4@cF zovq7#aDiE$x?4_}xY;$NZ?8k%>OLf?yKj?2lDgWgS1o%7*WgxuWVcz})cIc$_`iiM zf7n)qKLQzlJbIUY|9>Npp_I4F|F@zRN^hl$;Q8_aCs@>9?40z3J<`K+AXtF^!B>tTWkHNh$60!L9SM4V+N5qj6v5|2AM`^hU1sa@UDdhM1@Ht4DS z9@Eb;OK16l8>t zs}Y5`{4d(BGY{5r=hMXJrB;w9iq_Ftd_)oM+@;Q_u!|ZVpQx}Qig6`v5aSp==FkEfD(cWZn;l_XyUE_3c3dNOU=b;y>e#4XoR zd(pp$Po6v=s&M(A4CwV_&>sdyT8ca@L_EMlbg=;+RT$K{Sxcd0Y(_!ef!2AK{$~1= zdt~~mdrtbdOkd|B!uf?iP*Ca?Vb^pH*)y3cuS7h=HCSLrV_o(LKav7F==aS&;xXB% zn+74b8SxGt8~ctUJd6%4^2aF_suh-+T0988)v<5&?AsIe?J4`#fN$FTn7d@&grSd5 zY~o{?_^1O;yFbHKeYt`1%EWVAjnTM;(P+evBpTEHNC~|l8+Ait+V9D#e^P`m@cR6Vwad-FN?(PJ4cX#)VTLgF4;O_1k+ylYgJxFi~ zg#4Ru&b{Z{d*55{y`Qz9hnlL|-96RS)6?HK``?4^ACG2Tfq2Q^{ER=CwGyuks^4S& z6lnSqY`=Z}<_x^j8USa&6MtL8b20?Tm#O5hp*S|g`4pgW(ME_c;@$@dI60B zi3EVl7gf;LKKP9~bvFj$ih=MDz}1UCuHWd**Ub(4SB8O;E8zOY2=ULr{|7SpMa|yY z69|EP$xJSQ8=zXKmG$dh$8XZsD~$_q`(ppvQ@_Qpget(@Z}Hy{4a^Ewj=<{u2Xy?) zp32{eSb%$={VTlwPjKpMJsyDa-$2`!qytPUc))rB%G011F~BHPyf*Vvo=8Opa0PQL-?om^Y0Tc zdk^+zfM39W{yj4OOh>@0^FsUs(w5-c@9*8MmoNZ-@yYcY6#RPt0w7)lzj+Rz!2bLlntxRF z1qlRz1fB+xQ(m?@U+G2wD4^sIW{0_%o2fPMvjEV)WiOkpFN|>u3m|73h_rpF2H@q@ zC!xPluBQKb3icnKfV>(YmE0Q0)Pe)b!hT0CkX>wU=?L%wzyn2pK+*w*RzMnowXp*L z;U9YT#+JY=X>AHXd=a^sxM{rw*5jXSus>0z{~*Kv`xRmQx31F%AOXDvtGJn1{f|-8 zFU+gIqNV}JKo@_RTwc(!e}~&}vH(zkI)4mvRN&$7VgCD8^AGYB01YSwrX=(iz5gM4 z_upm;7WV%D=mlT^UH-1#zrc9@5^VpAr=cvs2fqJ=BLgu1bpD!-|HB;j=Vkaif>#1K zDP#TJHu2wc)9<8W{feOm0(M_+D}X`!g7XDn1C482Y~X`^rZ`^{xtpD3XJ+iq2TY6 zCMSUApJufG(Twgz;g6mR{f|K1|BTWF&;t#D-Nx`@Pi6C8wV4aR_@eOIW+vd_e{M7L zi_*WenH#|JYWmV<);~@E)@HUBg@0)?4}krjW*q;~jPpg||I%hIpdql$+%NX(|JBYG z7c+q8Md5W#$O}AtZS$YEDu0090DLb>e{VAv3xNOC6bQ-$2>fCC+wf1U96<0z;V+^7 zveE{%%Ksm3*9ifwfh~CZS_r=uBCmxgu(0Z~`PW2c^S{kLHm@1S=8q&}^Is(ho7cf^ z^Zzq=#a^o}{!(?azeJ(U>nO5$9ThhJ=O~wW^)LD2|F2PQ^BS=>uMueTe~u`rSO3y4 z{{I?LHm}iP^Z$3XWnR6@z7}$?h5T!w@LDLo7D}&$@@t_2EEr#2*CWJIzsm(&WWW5r zyzUDF1P111BKiA|5D3BFU)N&_e0vVlKW;OaUNb3^lPlA2-0~lPU--bUJa0xPF9{Kx z|MJB?r}$$IJKUFoh9tY>pf;kHbP6Bnncv=JxEEswtasu-@aMtCoWt9D1 zPV@MjKRg#tXTQoP?~=c#r>&F!wm<0MByT(3>e2PJgON7Xs*HLh!57&yMm&zRt$?y! z^i%v0^}BarWei@l;g+et^f;yCB#-d0Sqr4zEKL)Z?$FYpI<65<*X22@^qDL&4sOMq zJ0iMtCF~;lYh1%XsG1nUM)-;a(cM{J;1m|v4Kp(2Nr-lvXf5an3)=;ZdK7S@zJEirl+UEQzcsaHw+3sCmbJWat=2@+zTU3RFx>1ILObel`^n9 ze4JKlL2eBog_xX zl@zj(*HDyowdEM>4S6mQuydEJ6|$8>n?F zOnmYnr}PgAg*bW}p|xMQ+52!duWpH_$oWP{q>K&4byZsN=66(}lmoj7H|n0R-X6U# zSs7|CoQqTA>OKxBr2?6ZgIx}%IS~^<5*FS9%%DBZg2dG(4IgQdnvw)GD~;NNORE#V z)tq!1z))htmq#Qs+o$=eOqqA299wjbaFNz$dSe{hwrARFG^|%Ez8SfP$n60G|B35u zy!g#kR2>uRn|7W6+tV)+oK$k)8iZvXekei31w$~R(8vVhZgE3qf}wBre70y1HGgdq zpCxN@g}Hozb(}67v-NS0$6{(|^M7AljrgS*L%?`)s+=ccXi^ns^E8*9R`%TYy)$vF zG2NIJHP`v|DubjKEg&|?{fq}vx?2tW7tS4oE6Md{R0Nxeo9_NQ$qB)fN~S#?N(>tJ ztsEvbGo9y1x#^>gcg4d6YQ-Y6rn63nU;kdk;*4jf%hTyI6pFns z`am+ksHls)%RCmT(~d>qfAUPJ;#i3?3~)v0Q} zJu*)WRMtyE(gEyOgyuh~Q!z^;mwZw5XR_DK8BORJ?NzwhrF9gwIE1zek)#3qYN)>6 z{Nyz3XjXOadm|a=XpU?^GHKLW7)NZCBq=A(A=ClG=PzcCbkg_vWcNORyT*Pq8(Wg7n^ml7a|;j=dHHp&? z1c^4L>KjUbFrd%Tp>`%f7Zh&nY$B$XH(R#I{jkTi&_i;R<+)9UFIj1fJw)cSF+IrT z3&RrGdDk1ts&|nYzBK#I=_A1~^-68t_id!EyQKqx711;mmXo{rDEz4l_e}-m7OO{k zCWfSY<66J9HtJ((ZHgtcF#sebOU#gX{JcC9s|PGc-!(fy&WT_y;aVFmBI*MdEk1ixwjhj4PKz_dy4}Tg zD)yB#asi)Hb3$pz$e5X+NehAn!3pbA1Mwk_3JNn$&8oIl^Q!jOCOvpQ88*V``+L|T zh#cwl@m*PBoUvus(8eVY+nM?baqtT91FeW36%2CodCj$)Z%pi2x|chS9nXzEICl2I zuYvrMyO`{FA8sbk-)Zk5w{Bc7meMP6dnagft08E^;Q!8`-{6!~<3dM#+aJ?WS2D%8 zey@2}-ifB{6B8s$z5U0z79P0-ts-tWumvOgMo-oaY%b>qr0ii~P0$qq`t3;vhEMa@ zC_{l=*WodZB3GcR<8tH%a{R*O(Ief*HCssGMl~OfWOUZ>CpG#CO^|sGyh?2Pbua{G z*Nl$1b)$p|Ox~{6G{@K+XkAKcsu*Dk8_{e>rn^2Q4#d_k)-7pq{Ex79U+07p zkq=XXr~Qz^CAo-zZK*PJYTpqOmv%x_$9qq_2gFGS1QRufzHVlCaL|^Fre~7FW@CPI zf-BnS;*^l)1JRjJ_lY&6m*8K9O=vxjhqBh*1?+XpA5RQ@wnnZ0^3qwO&ls2cy_^iJn7pLOst@Ff=D2 zD_rEv-n6SDKI?1D41}1uoOQB5QB#^n#`&fbDa-M%nXU^AE0ahxcKo8op7^&5ff=&! zx{C}-Uz!IR-e91E`IaL6EcX(e<3Rbzt=y>~h6}AS{4vqSs6MiFmjYY}c>uIRwfq)< zxGtAUf8@He7p5^gSJP{oielDPV@Y-5GDIo-F&AOM-#4r{A=Js~Z504_)rLl%o;hg& z6XGmShri~r{GH*2j>yIe#{{G$4)`Wo_q-?3I2*~~bcppE4#m!AyWvF>-Nqi?uq3?> zqS>7FlyOJJ;Urmj+__`T`I`{Eu2ir{YPm(RUbQ4JX>=*nyUj1<<8#GWu|MK5lXU%K zIq^iDdbMb8$wD#>2;jg;Ne`wl0t(wdRG5d9SIrjI6%n#Cl(ZuWf8(z^ohtOw8}g08 zvRmYM8y#1TZ4ptt6sTQ>g0UzNsKbnX)SdaTK6Fa7RCtgZ_$71k;`6b<9-D`X;CT#n z=~3}QYMsnb=R;$ab9KGRgNqmQk&k6hro2&y;1T?PJ!)Q-}2WdV*=Bxk%KWyy2k@| z+U$cvZbbc-nC;UxAd~-={E+eHc@ak~jofHkdt;(RGH+*ClapVAR;t$kz$O*33ojN6 zJPG7O9^65Wl$G$EJ8ZrB1am`O{1DSY1AGCzhc zg8J!C_meJSET2mdZY;Oi+BNtBP2X_r^Ud7m^yR!XI(_r8wcXMd!@HD@HKZ#n%W?d}Z;*sQN8sIAM{IgDNi8Yv1|ar;Jg_i@}X5dOht#Kd|W+Wdh0suQm&Tmlx-%Pivn9&3{sU zUEq+|df!BWH?B3zIx`%8#7vDr5Kg|ljOIM+B4ip0|6Su4bTlE-2HACgywITFj!Qz? zwW`nN85|WH17bnbjXMD6aH=TVq0Aht3D4}XO2gb6P!l5G5Es)mA{T;}f8@%(juD=I zG+p>nmYdRjM>L>rT*w&~QvJ_1M;jkGKRbAp|K zFC4{>#Bs7X0z5h_9(Tni!C3^R2xA|+KSpvu$s)^NLs8#w=l`IZFbT-{Hu8Z*IJ0iM z$*HW78zste#mHkPsw}I$URS2m`BN7CEw>9xDB4ae5mtJiw4wsDg*)(T|CaH4trK`S zuMMb&5^c_guXn{vBg<(3$2HsQ^WK*zrX(gsoK(x>r3|_jlNoFr{vT#%p=RtHZA+}8 ziUz7xS7uaCo3;%(??@gOjC?c!@oeevt%eR^MFIQ!w}C-^iM)(q;=J{21fmJj;uThW zCbCN=wfgNVx%tVXkF^jkU!{d^{;ny2eOXfY$Oh&pkMqZ;e;7vXoZk>DO!2UBfcqj(S|jk8OP(dlW7 zRjkHF+90Wux=9GsN9A7DZPE5xx

c>|%SDxW5x!)!SiK2caXVdxXhVnV!2v*`W;Y z@7hLwMu29J&!+s%3om}&?EK$Vq)VEE$X;|!P^l$b-9UnVWG8z@9Sa-ugyfz^Fu0g-75lE%T2e{xvV z3Z^YMs3XQZjTtsL2(mvjg_Jwbkp;4tFR&P&M;U$n2AVT|sMcMG&xpPzAfG^ShuLz9 zc3_EYLr1ZU^oX(?Qw^>PgPmhO71=9uNC@8A#G+$%X@|uLhD_fYR|e2v$rl?pC}M6A zVw27T=N8GrbGLk>`nmS~a;=Ye+B`m{AgeLH?sbJ8edPQWe+{N*MSM`ZnM-7d+ep$L zH|lz4Rt4LSHk`weok&cyzPSsn6y{d>Dc5?Yg?*>uvese`Jd!skz;OsL?=fNM-E zRcjeRXfzf4_-zbs7*3ixz0}OPilVu6Nes2}i@$>lYV zlOXg7O_?u{gsLcXy#fPXDPH`GMZp}IXBkf<-mN^d6Kdk%DRDY2a*g1*VPvGa6_2vH zdM@T=S$afyiZDIu2&>i7-3R(8bhjxRxfIu)nIp&wl-?N(Ds8;=omPmJMo&2xKzNtP1Blm^zQNgGou(W)<_ zF|GJ*D#AJBm-sa`NuT!45E$25zxVCM;bT0DJ2n#4!$pwIHAhwu;57J$qnM4}tfeQm zN;zuk8h+IFg!{e8y`O5W>=}?<-RnZraf34j3S_j$WxO&(H1dd764IZy3!(;|=Sn6f zj3DkVN;2Px=<(} zlu~i=q{DI^&|EXCNE6RyNHr`MX%aE-$dMYvHz6vk$#UTj`HVi^Mt229K znMY-HlAwg889SuLITfU(m%{h%hvVC(3*xSu451D>MPfC9D&Z*I7IUqvDRJc^z^yb#$)($&U06}FDJrPlsagE^1 zP*K{iAG{dyzQowG4!W93D5jkuk?|__xF3LSKwD`544+VD9XnGwKbxAadl ztcL5y2Tz}B%$FR>wo6b*>N=&3$l@0bTTJV+e^0)xKzq0~j&nT1mUIG9DW#aT=ltvt zO|z;z&?}dKaAeM-shCwc>(kE82q*)Ig;B!-7Pf(D*|#3blk|S4k@qQ)R_Sp)bTox z!HRRAFnzM~bnv)_czsY0o=i&xs&Z4L_$UOXyeMRF`{J&BimrU zp92;<5@vO(JgDJDS;~fn(K8XS%+J_S^*9m7^zmUc879Rcam;6%H@oItmf#(qhAT=x zWzI=MyR55n3$%`@RySt`WOeAl{<530#I;OK=A(2C>V?{CpN6>~E>0Av{zjBc<9Eg> zaj!m*L3%(mFjb>i#P8i0-)?*%?25KsHeiHV_C0j4rii9#k7OPP`jTy6yFc-0#Mam6 z%dl@{d=7UmL%XEds#_PWlhdsPzVX6iRbkVig<3+Vb{Q5XYKRe6yYL7~plO*z#7qJg zt;H@4$7P!X^4w{9qS5{V;?snSAh^;pKT}<)pxS-04Pm%lKE$v5gs}VAdr>97#VGI)TC2B2U0cvrUr%tyZYNYvv237o;5LOn3ht>eF5>0v zm6OWUyNzg9d{t5_Y;0McH?>Y^j!b!C*Tt8)$r(aN&fK+JD1EZSqKL@40{z&JCNJzt zQ-Kz^f8PRpogR5x(6$^@Q)8o>E+-eP-5OPE(^keWy^-`)LX7-L)`!@Y-XkeC&ikNv zE>8*(7kEC*YC8bl;-@)~<2%>^*pwF0vxIPP!~qrS+N2vphTAg@MZv;dw37f+1u7YR z4V`_q+!IfO*@f&|M26LhROz{gKtJ{;%fyzLe#<2G)nXR7Nr@7wY*h_@xbWojj_Q?3 zT6M*)9D1hP(zAD4mpL|%0ZM#CdaNn213A}B-U`{LN5b&$Mz~JV9k@I!)Xq@v%{QXN zeS8KNb}?iXpQpJVQGez)8H{+bkJy7m<#uKc%-^U_35$sqo1@Lszc7PO0OwGuHm}R&+T1qjQEBL=E`c8b zns7>u?RkCCO6NpR$`1A6A~wrcG0llU-n1!$F8Hd8R5Yf~*izZfKSMM$1N^CS`(xW1 zBX>QR5uQ5aM6K8v0{+sjtfx%N_&KoDgzEPt26f8|@Eo5tqp{yD7k(0=R;Pcc3sV{R zF`NLw+WaIr@ZMFm435C~yO|SYx`rvY$)&V(h^~AE?US_j*EBzoTNrv>Pm|Kv${Rp! zUjvOui1($bX`!C2w6jqE$K)|(Gf1(qo#M|5lgUf{ws!9|MyDE8X5`c}^%Ei&sm!yf zL1)`<<`c4iB#W)?^ba$^C(snsn(`V*J!Y>GhJ`O1`c`AMjSG56R=g2-NZW3*Z#*8E zOhQL`%=I~y4k}OdBYz00EA*iJUM=%3(<|e0LIDFgn6wGIhdenG0>)n!aB}3>g=P_5 zU#HI83U=$U*HuzKalI>q0Y0`E*tutn-JtXq%chRcP{Y&=1547BB_YiAF*`J@^QS7! z-blH!;=7~tE^cTS*g*lb%Ao-B-~;8aSs(%rNs}aybZuc&z=VCtx9;o|9!zx{HTt9y+$4APv0n{b?P>#@CXrI=CJl(}k zEL&!udFbpfL;MKEm4kS_)MRrAQ+rVr0Z(?r?SgyDIUEfuoK1Zy%Lu0SgO9D!kh~ef zW3&8@r3^eVY*`I~8+GjRb3A?iuo}Y_J-B#N5dfKY`{h&VaX)gNYYzLkRvoVs*I8?3mTO zNLK@|sgQYiP-T%GX_PVH?0qN(7mKKTAsgbTo`7AriC$In%u=GYTixy)-q`(cwN;#_ zi7G*H3&W?TnKX>556%eGpN|?uR`U>wPfT+CR>XL5X(son?Bup^<~3AJSQfdyRDkTz zTk@lvZQpIHOhL&(;yb^IbDzE)9JC@2hgHXJBKlq&>Zef6w$$i=$tE~+D>O7$i8c>N z^u8!$I9Xj;sDy1L)&68Sx4AsL>pU+8mC{VgSjn3b&i|-#j3Oj@vnxh2f+#;qkz(qk zKoOXxPZKbCKB>?)8B^noYfGRM5$lf0&4YzMci6%UG+{3L{-7v+P}z6<8zJc3Zs znb$5V43~V#SlUvg@Xy(!d3qtuLT2&IH{Y6x*RsQ9);@iC8{!K7i9WE8RtByxz3=?0 zt!G6=hHWfSnWVwL*kN8z$Tn8!mPLevD;Vlsx4n98aFPHAJD;;|hPCzko}w%7X(-)= ztDh&_SH|(02QrbT(fRgsR#I*1eM&Pf%i@R&Fm&Ui6x3@vv15%VV>a4{2lsZ_VKjWn zKlJ6nIOaZDx4GfiD$nIxZ&$6b%GT>;Aa1eiL4`c>u;1}wrsTNVqKZyTU=|k9*fvy^ z@hc_a0_LFBbWT#zTiZtUT1-Z1cKjHPV)r32r_oRe`= z+ndN)MA6s<$k`0FHL|9VGK}HcBCthisWL}zeawbZs4uR`&@^_2n?iP)8XW)#)4-T^ zqY%XYv+v=hf*WQM{-QMvS5ZD|*64b(d;f_()fgt& z4UclkYzXud1gxbUUb zXj5l8@N^HkyrEeOzqik*dw)#4@Y8Y}3y(F4+|dbeR)0<>oqW_>wM1AjeoAl-QWIAzdD(2VcHMg2iKc|~d{2;>gH6Rz+za5yNt$o%s zX}k~OdS--Lfv?{ec8^N#^fzwYmyuy{7Ug%zIQwi6XOClwsJTB3E34GFoipCVJIS}6 zrk@RnTC%yS53`Gn*)cil_GLQL^gv@>(d-flbDyb;z$QVEt1Vel8kNvrSZ>SJ^JXz~ zgTmEoH@o2FtP%6@2{_T+9FAC#=j*HfMmccXVC=y_9#Q*iKgf)eJ4$-cLxamVKPsO4 z>~4i2f`jR-$m`Z1KIw90${FDo87_uZaEHj1rAI!dc zN3^5gn$pYJo60Se@^#4Z%|{k@q}6-47gDb$!Ky1LKA$MAR<|Un8x{Ge-Q1q3MOmuO zOaHR$6jSR_e11P0f&54)B+Z1{Y@iU=oWnmi_7hv8AYFdGG*Wo&x#M!Qr5G%ub9faM z1KG6(TN4~#;Qbd1GDC;rS_Q1rN(P+0iEktkAh6tv`y z-ke(nslcfq=XxZ>Sn5d8INu+Z&X?4mRdD0X76ekYhaGlwNH6On#sq32)77RB^%XH3 zHeKpilJY7Ib<#sk@rU>xj5F-Sv-LN*->bonu7i2P(NMI&)g?a0vVt<`^@u_4-Gbc{(V){5K<>#a z@IWx=ZMii1w@N4p9wbU1{!G;HpiA|^5WJ(g?9kf1=@?m8AWs#Ok;Y9M|9Ov5_d&;! zZC3+;Nl}Qwcyel=wy-c)N02WC2^(K(_9>Js$&5Em*dktgSBX`(Kc2^|iYiMj%#$@{ zoN5k7(PkKo?-O^e8F=G_@#RJ;^yF4#igN0F^FUEXZVv~JEMs zx##)*Q$L(X+x4}Rmq`n6g=4_bJHOLw$NoVe=OK|SJ5U}puF#0@ZO4+pV!~qOS zSeYCYe<^MMPnyj2n1U{lz~_%^3o39|7;=p{9YcHC61l=kf(#!VmG<{AcrnK3!FQGQ z03Z1Id?5CkMAGZP>f(FH;Px?vy^>X7f;|2z|XM zgdZ{9b*c;X=^pq>6{B;&dYHMZE)$*O)c0|{DCwuZd`fJgnRb!2Ag4f#@OR>BB`}Qn z>pRY$C7;Ivn5gK6WkiNiJ9ujNpM8S`vscAOXyJZ++aT@QkQ%Xp`w89PnT3q8;b^(B zpoBvz@P@W4ThyRnR|*ck|ITvht`P%EdQubdT&7*y`(4@nGt>hgg`_gKtnd32zv@D# z&g&W6b}BXQSUAi*=N6E$bz=ZGV48q^Sa<7 z#q88Bj)_?yUWkbPcn(!;W@5!qgF{WT^%08Z%+0Qriexky{_q947^g)lL8u&Kt&0Pq z!l0Bd{oq#;15U@*r9f$cFf%;G?!gq+!!Y{RlKgYUQtJg^y%77!qtc4XYmXG5*5tGD zcDdoW-t5}9S(TJqqgzXC7`k-DSk<(2cSC06RWncwiR|K=VvQ$~R(e zhTTd~{7nXcxjab(;CR4o4c3#bB3nqnKVOQvO%S+0p#-qCLeezHuYAp~{oejHW<4$K zhH$pc-)XLs^Ocob~E7-Zi(2nCW(>6XeLqqC76k}-hHN> zG-1lz+Dcs~h<-nmri1atAg^k2P7c9SNGKIZ-ZwNC-?B_}d>`=oEIa;VZI=j8{qytV z@XuY)OJc83{>WbfB19B1aYG}MBTU2SyV92!UZ3~_ocDMx`Mo}NNE!524vg)l>|$Qh zdPO~jcSN%Ya|c-CHCCDRK8XgPTCKyn1}{zc@XXbhw|KUESYeUGpCN5r;v3}qaAC@` zeGldd`GqV@m4W)yH^kbQl8m|-yPHBv+BgtB5uTeuehUJ!UVf|IucG;TdVMI8n5&Yf zgIo z);Lp6)8r~68!&^eOt@_@*o)w|^wj?5Ru%e(c7rZ5Eie;rN3q70ASjd}s7TG}H0B1! z@~f1Xg@Yy=F4ntZ#z;S*ID-YrCUH8_3jCDl>7b+b3Ewm?uV{4bb76Z) z=|#7rhhp z9r2QVc;S3RUMa^5xcNKVw(M>xZpD_EAz>Uy#))C0R3Pk#_`~X}Cb)jUJ3NA%o{xCf z3q~KHz&UUVmMV;Df~&@V;O=mU1UQ$(&(Msg&XPK3bBvT1w8EKW<>;wHw8x1|Jy56O zg^jU*U1*_p1c$OwXONIEqJ?@yZ2F01gyAc})~XTcu;h%|(@*H-{bn4N{nD-l_ZHs)=nuXS3#>b5_BpUfNtvD`B!Vg6#a84SG zJ?G^{3M%&}7>W52o6dG_G(l_rbzLx@;_A?2sxZd;{Oj^zYzGtdB(@a&0bD~TdFM&~ z4-#AG^mh~eq2XB8dvaChq(y4nF6xZ?HmOjUzE%Esa&yei{xY0QGaRY8J#vT^)=ni* z^-H;L#^-Wm0=)3X7jks^?8=dB*tK$cL=cf?Hk}Z$tZTFaDDdd#jMAXSIJ9zmWDrB4 zB&|U3DyEGZp={Z?RRS8%!rBR`&UD(7`#hBaJcGK@Pg3F$QCdCs%GaGnGNF_oYxweZ zW#GP`k*H^GF7aq1Ho}Bf;%cmKGO7kS0R2 zj8j$*wlI;bV~0-jr$&cn8wWM?rcWUvjfN@a@+KOT9KcmbcL0cLb21AwlR>2HmW!7u-aLBplmB4gdC+oQ)o?U~$+ z<&vvg!%Id@*V^PTFfP~gBoTk#43~GuuE5g{Ga>BZf*&L}V-_j+Wz4+d?W!IKGU>KE z!Z@1AI=gn$16rO0F(cgvs< zTjWGe$`TJQ;9#8#drg~je05=hxCb9=B1s#)goQiEsmCIW7*x(Aqu@u2NGmdwET0;_ysA5qcso{~(R4#E+>7TKAfW)J z8XytHk1S8WXE#q=CL94(iPz6=HA7q_EE3?J{Psg(97}8+to5yJ$jl>DWE59uyTErN z@@JkO5!%y(&KeO>-6u^%jkoZToFM=iLj^A|`zdbr)g_=Ye!HEY`b(rH0kXNxedRfpOBzus0ef|IsBK}C=J;GU@ksx|v zrdQKAlQD&a64FFS7>{l~bRjtoat zg8>XfrLN7y1*Lo!9&=AnIg!z7C$@w_xwoUoIHs6#U-Z%@ds_j9TdnJ@%j}w2j;zP2(s6q_DbmezVD-*sef9t zoMrBY#`i{4gO5Pty@Uo=yH=<8R-8@gpwdnauXune2lp3i{fLPptl&=25XtqyJdLPg z`{g#w&r_Sfz+TXX6Z__v>r_B~t=E5tHdF+m_+Oz7U+Lwq6e*?`w$#6T!{u+<6v=#YVzgzK~?ij#L0KJiBXhiffV|-2Na0F z3@g!?3R8JmsdJV^yNAOyujUz1&6`#-4@mp!?GL{k+6mrm%W$BtLKtez%|{UgVBRV% ze9faR6Np@!a|Pud_Z zf!)8B1V|DxYG+uoGulQ_J>Hol%U`0)Q#RlGeRFvKD-k3?f6A>!y1-;joRQET86C=) z1GV-hBIhy5O)o*erW}8D8l|JLy+8CahkQH0*`Oa6KXe_(?1N?&uf`rdm9{=tYdE`O z^tMKu3ufCSp+5-U$6Kx*$Kt9IIvv{Pcl{+Ow(d`fdU_&;hVgSlWFrw3^%`rvRKare zZp(1~)c0eC0qd)XmZC*Y)UA&BVb|=!^KKNG*lp`!0x|u)@U?aP$@>G-!Hd**(5To; zHD{}8#M<^Xkr<)-=>6OXQFRNe@B+yX(kM7v=(rz0U&QG)p-0#4JdhEst@Y#8A;MQ) z44V*0Om7NoLW=ZwS^xrDYm>I&@`0fa8Mbqj%TiGtfp(S!V7h(gzsk>ez|C6bjR24D zM;TvjM;~V(;Zh_}b?8WAh=>fjbzG2DCIHc_qCFs_QM~;5A<6+6$}0N0d))JoEIfyz z6zkb@5|8mK%8j#C*;G(_39>EICa&~nC>jyw&c&{S8bX-CQiy*2YExa1QUNzY8ZPDu(F59=Fc3`N3#{fLvZf{X2ujzx@(0liE(1AfFUa=f8i8(_SVDZoWu zY6>eAws+8K^EnGQ01>3?P)(ey2o|eAd??!Dy~(1g_)n!8Nn$w$Rq_D%UCokpb-V4! zkv;ERF_-TjVxV`BL|n$vg))7~#+UQ65mgqY4<_x{OqxpF7txz&_tY@y2IYAN6odf= z34Wq3(}5;Y!6>YvIM34=X^Z}K=4XjR#Ht91AX?@ySo24}yct2jAd*sS^0F$>+2@{$ z=bT5Drz3|GJH;x;OB8H3^s?^&X~u8|9i@ES^~}xCMy--xef!tI9z-7D^^0bodeQbe z;bjwTq4?A(jExi=gQW$Hn7K&_bO=`@3>Qsq_GU??24J1Q*#NE3!(`x3~`xK`n%QgM1|t%?kvX8 zh>+D(-J~M!jxoN0pN;PP=H#S2xVW&>o;cYfULG;ZC;hbD*mDFYk^-`?_;^+oaT!|k z=}EwSVP8sIVg`eEb!BuYS3iy@wV#B0u@Wq#QsIKhZ~RFfe?i5XxuL!dZjUvagN}vx z5o=}-K70dY8SR5e)je^7q;+Dx<=#mFF)O-uGPR&F9Xz%lf+vXeonaz3EW0r*;r_zV zHooM&8So9mnOq|VzSbFGsTN6YI@v~M4^M!Z&|)H=icn4{c=ovAOFxv9n`YXCSb|M+ zF^xzuYj>KI56kzITby63A^Ru=`<(v!UNEHU30iMqA0WVC4PpyY@Z_d+!00}cCD!h= zyLM~}W9xjU%p>H_mYH|d-F|nH$|rLXYuf7a;c4R+3%2mR;7!xqrGQij{(5hC?bo(! zX>8H0fO)Tv0ir0Z@R*R|&t^fF209}B2HT8jQHDC&lHPZF1*QpQy2M5-Tc4Bco;l46 z!0XQU6%3vh?*ykipRP+BD;I5A9!)96+P)I#mw0yTfTtfV=YuO~cnmkPMWE(#^(*5RkJ^=H(9wxH|09L#h*x4i&Lw>?Ux^P>un}v-R&bB_ zu-!H52V*7`Q=6;c8^FcWe*4M#5x30FV|I?PR&Vu*Ek0j=#J9HQNcJDq~nXq z%|0k@(?&Lf3LT-aUF1`23{}UkSma+Nn%Ud1I$z`J^ICa4Z>IIkoge2{=atRn zz6X2qubnoRes9}!r~QcVsWdlfv?BatA#ruUuX{3(rLFKEaU4Pex3L4g?`K*H>ac&n z(_LR}OZCq^@Tr+@Jchi@%8M)hb@pETm%ib9-x;6Jyo+a5u;T-~RPQx?G zF}5LO$agyA+U%#k>4} zti5B9r(uxoS+;H4wr$(CZQEV8?fRE(+qP|VRdx0DOl-tX#EqDpy?ejC@kG3z^JJd< z<=GOY3HHBOs5#FJ^cmRK88rlQ1z#V-dQUw3s72uO#ZDOoWeNoZOht<5B|l6Fv?ziMNd}4> z7^LWZfw%<>>hP<7bF()u3zhu$iz)r?_Fvy;3xh09$ApraTYLyOtVWwZ5Vqp3PY12D zw#m3ToVEJxJexfx_kT3HKv6gh5S?mn7C+37D34pR?74o^+P4UZFJ4sLTxt=_YQvcv7&9H632bPFkOTsHy$L6R?Mzkas0@8z;b=;Qh1!I zUaE8MUH#0^oSpP{XJvOwC2WIBY{;lA1fh`=i$-em&D=QH1~uCL_T5kuU^hRck=bf?m& zep>Y>z;?2&)PS9D7t+FNKZL8;8iTAA$4;mD+|PJ^g>yagP8h$g6UMgcZo*U#VR0Y$ zw8UiP90BPwW^*KO>ARmVmBCFg9E7I!9Ydq##aDcK<<)H&;P`$R*o<`CR<;cPhz*o0 z%0A)zWLY8fkf8+R#?l<3*MpJswXyk`VwCL2gK8AsT3Z6S?Xj%&29r7l`E`lT^p zj@%L5HN7QWn9}9R?vvFC=NdlsH%9@-cziYzDg$zl&J zzO(?5QyrUbmC?B^`H>k-zP1D1=BRp&$d#*ElS3k_*1T^JVS0P}*G;;qAqv-M9Q@6j zAr)UFCu1FJQkeqCqONuPdJ5|iU+h(4vTM&}m7FP+uHF|M z59%y>7VD$SGczdX|i8VKXezMU=;4o8?if$F^ioOFq8uGVCl6@G>KHw^8w8a@d)j1}lqa zL*!WQfz)k9X#4o&tKBMj3R&3;Xo3R@YEdOgygR-n@}8mPu6ml%pzdi`v!m`C7@S+( z0dqkU8Jz+#m1a$;G~`3;uNIY#&HM~w0yTId5x#{jIFD&bFEqX~qE$&yE0VK~$0|~S zmBr^yYcTn)jcz|Fka_#14-`Y#8*jBX` zXvVEA&&!!q5Ec`}k;hdU>6mvgd=v)i4}7>Ux5U@d~GMlzDt+X>GaD;5kX_bWh78QCD?(aufQ)!?#Lt zP^DY7(Imugs3wM$Z&RP}n!{2Ji)rX&rh(B)?3&)ACpWk9<=cn-dkre2F7EKEFT-!c z^&nm$-!tm-^{Bgy7E=XU{+wO{Npval?`kxB z723($8Y1ZY4Mw5xbl363OZPElU;Z-E0|85?+(Zr#G|R=n(ycGxHAc$@rGs z9eVDfwK`|oegt0jd^Pq6{p?~iFsEAhBAsHNBTDQ{JXS_)YZ{LjB3#MUrgJ;s*uys~ zJQ0QhH}V97x{_MhNK=a~xOT-F zo>davMWz&%o#C=NxJ^W1a+Go8H-jq<*gDWCY`dr)Ecl)1J$nsZQMFhC>R0C{;jnOX z4FcLq4IN2o%XX)~(`d=MJ!%w}DADUpYC$gB;Jx$}C%%AGTo2Rd2yQiL7QM1obIe zaU{KRr(Z*+%4~Axn-!bv%$pHk{+A25_?ZEPc`Pt3T`}Dgy-S2P;(Fk%O-6#r2-@b$ zPaXCr+HK)$=^Fjutt*!*Rd|dPzP{ef(T~$*H;JvTp)4X;d@3%|FK=r(tp@*as7F+4 zm6ctV{S2fKAb!zjCL4OuSk~LT&y1otIt?nUeWySh$B$(Cb2-oO1lEQ>G<$HlZtC+p?<2t55Fgikxz=m!?s%?!ex#e=?s=$2_w+W4`5_R#J6e z1WpTD^GoV||4j>|ndmzSgqmkVoR|Guvmm2trB9L8E(1B>6iDHXLB{dsxgQOGc>b33 z&;dsI8Ll=r07NUrWr&2Lpk9z7(;hjhV}wFCe){&aR0q`hmF*{a1y?cM!?e6xI{z3IZn zfU_i0f_E~Dri?m830_orXiyez<7ESvsM=IMwYmhIG9$8#a{iz~vE!R;uRy(Pz=2DN z!Xm8;6z3=JW{U5CD!eWVF=Vm66|X}{Z@`1OkcDxKirclOcli*1_#^WyMwehE78Xb! z^>Jwm+mM=+QJ*pu{p7so)X+{j>Zg`hclg8OqbTS{Gng*@3iJIGaq)qJckH{Md3T@R z-zWIDJbxyBQ5>N3YaT?E_lRn^S6YuD-4KGJ*ppM%p0dem$VWE_j!KPrhh#O@TooF0 zw;F#BkY)di&<+`g{5QB%aWg7NV2M7e+2tAIk+8@CXRz`x+*e6zLf(5YY;k{|hVL{29@t{i*&Nu+jN>BiA`5D$pA-*`A%UssWCb4hy$W`u(T~HQ%u%`f zjBOubY%y3+J^cG4+&fSkEXX#x;$!O$M2S~g!)hizxc7OL3aOnfanx~>KjJEe9ko&H zai2{f7Gw!Vxh+u zBEGELUMHu4=&uCsWtkGCf1)JJpJ3<315+GyqQ&+49wsnJI&hc$EkNRr)aoNq$h-&} z(4wn#8rM-jKf{j0tVw5Z6m2N`z%61A1;{r^zM;psq*mMp|IHTc)}Hkeb!w=s42Q+@ zfB6yp49BmE>3aRRkTRLB-jVp`Iq%pp%_d@t)oR0GA-+))OPompKKw)YPy%Jk65+8p608Ub;X|*I_u1-o6G79e4Sboe-u}i;mnWV=dsN@J2x=V z1Y`T6YOvUKf?SC4w3TvKdx6zKA*A+6bqXXKh&`}%rKNnU+mAef|FIe)vuj`AM<`Mb zXkM#f2E_NkgHukbMHjbM46o7m-HWfLa*$oP2=1Yk!DKdz|G-`={%bf#BxZ&vdM{oW z+Z*K36%5MF_*;lL8;55I)a5=y=3e1OYOov;CQoih-sHBM*k>*BS*B3p5dlt)P&?() zNHTwGMb!YRLr$uF5qr<2yyPq4czx!`L4TA}TW&bz`F;;QNY<64n>_Q_dYb#IV5Ka< zjy2S8h{wbRrSfFBVO)uZjPY`vFm~GA;AjRnC)u?L%ef4q4vvS26g+d^Evn*(jo-fq zp*_@HMmKixb}K4e6=<}|*s9|XEchV~*KKwH+sj~0d&M$=pR0(yhA2j48d8vQqA+G6S~ zY=yL^`^K;W?#Joc66(ecznVcC{cuZ9x1oGkd6V!*5XKBSzIb@US{p?-DLk-b0kd@A zHZ@vi9x3KuvXv)(#f(-Rch8g2=eXv-gcz z&VQ`Q2wT@T@d$gbwfoqvaNDgi`LjRaB`hJ0r%`(=}YAG4i zH3@*7g70^UD&e{2)lG1W>0dhBxaH>(VIYKr(R_Uoxih|flg5$G|(5gxmI&gX&&U6oZX zokf`l0=}7I(8cj{t=9P0k7w{X{r;Bxu$vXByG>?20I#^`R+rK$vpKSAjbCy&w`P+2 zpNH<~M4;i+5rfUCXV9P< zDfyc*{yW1M!PZn)t9!yrdyV)>hjRMSZ*BC+nBueOUY_g{Qd76erl9v;_Z|NJAaxe_ z6m-AKP-!X?5)GasPN{@~Uqr%8LW~Ea(3I0P3v+sLl!`YaDbF`4$M;uGI|-+wsKXuV zC*fSe!6#v~pC8&6#Fs@&v@(Q1wtuXD4*qb0`FPWD*1Uqz{^6!K9WV1vM!>l*Z&JP@ zVv7LYMKhxRHJ$kUvxFN})HGO`PZGOt()>>}6}_rN@DtB0}39&=Kpti{y0F zqbW)MZwB7zycq@KebWlS^2Yln;s)Yo;>P98_zmR^oQH+caRGqW-w~xCFfDv*5GTko zkr_YNO$wd6Q5}3qAf%;g>S}1*hA$FIg@Xuw#5FTP<_e%WUKXd_~PK&3QgGcdmBwMUy` z^XLqhk9^FoX3|4rQ}H;}Wg8VQGBZX~gGo4kw5dnoesIjiCwWmxXk9#~3DK<}s@Fh- zkd4$i7*2A>Xo4y090;BGB`Z4awens*aumRqUqay~7u~rHmXv@_hP;US_^p;CwsRkJ zu7~fQ&u|?A4VZg}iHiD?_A)>rLw-+roXN&Y6021hY}QE<6H^>rCXph^FIQ$+Ql{3| z@F_006#n$Mj4=|ZfKlA4vfJO~@F6^KhAddEmj^!}_Kc2yK=N>|s0JUI5_3#3n>8o@a5mXw6g zrm5j`w*ku14BrrY5ArYsU!ox@qXCq*BF)RgoN)4-Fn~Xm2JI-B^UH1Ha~ov22?{V2 z`}=1{WOK=5v}g$-wI&|FnrxwiUv34pfX!3jr=gKi648&k&a_C~FF!g<@(HdfTTdzpqv-sv|B7Citk0d_Ga&l1I^w6 zf=yqI^MXhaCstr5a3V{}x z&l_cx&y^}l$b?Ws@i!j(I>Ng9a^Ov3NCbruQ+q@=G*E%$Ljpv#QBYQbx3EJ#=*~ez ze2QUdM0QHZxU0$vnbeAJa_CO!ARTHzdnKYvG(Z8wP=8CC*KLp(G?Dw&#OSKx>E4Ox z-YvE67^#p6EfR&4joXPEbEM_S+tATbXUp0`QT=q9T2r;bf#n7FKXKA3XpZ27J3^pR zB^cF^H7lcPzz#J?ZXk!?X^te+$K+d|UfO13%HOGcXpT3v z0qG5pKy-Ko=(kjkR7ve&af)8EJ;3vi&7c%Fj4kbUr8*XEFrUFdr`2?rggKAjVxW0d zp>wN3=hua@YzyYi=5>tgNSahpwCp3RpF-=lg}81DbvPFs_->I9UAjsR?RSF}pjAn# zYJU2nJ=9c~&DTj^!d%V?Dq?f-J9p%7ED0P9g#o^4y<-OF?mM`~rWVcjtH}|Xn%aRO znW0r1nY6Jy<_2U}@^2Wvyk>v0?`KJJhxPUW)PVEJxGzeQG0zRbjc(#&<~~kdsigPM zwRLJ}O0zL@cjRN=8~?XpBeH*v0@4GROkHHs{OV*bVJf#^DIS_j@zT>7gtHH{jUNx= zYzDVtHlcICh=4^wm@n#cuXh-4p8kbyWXPjkxbsj*)Z@Ot#5SDBU~!o3a!?{ zAhcyNOr-K52^6x)B#8D)iTUDRiZ*1P3VHSO#e>&J{re{LRMt7|IPYd+wN0 z)+^oZ6Gm^?$4SQz!T)e6_4^&o zcW{A#1{D4~mr?+T>;IEW`Ts<+GnzRWv;60>8r%Pt71^sLo4Cz^)OW54#Vs8~qP3?9 z5P~U{a*)O;^<@PUNw?C~l2((Z>E1Tn$LGji2bHhCLMMPf$fy{RnSNkry@YY!v7o6xN>tt4cUv_^$A zxK&p~9l*Ot@wh~Bb;HnL6#QIp@YswVcg*LM9)=@ZRvUnta> zW3NqNYxeVmWV6R+4#^f+KPpAe{JxrKbF*qMbFX_Jv!3QpLyX(+rYye%wFxMXdKI8N zQVL<0tC&1XjCa3HLZ)3y`_or;Lh|+UI6eLpZKA#A25C_U$0P%&2x3hnZs=weu8efa z^X?^$Huw{<8r%yioJM+2YR)t{(DjN&8SGfQZFr2!$Gsm!(pFaBoJFJgf?VBP&R&Ie z{A%we={xulr)feT)EOCm3j>{3HGEROIHv8JhN%ONvcN-rkw&!c7i&5%&?%KHZ&11zzLsf`9=(O!BFxzV zw~buhrHmf*QIA1P6TrhQO&Mxk3Yy7IaZFK4BYeSYL;!Y_lx61e6^8DBpEM19*j8nA z^LI@mg>6ceJ=x6y<+|}QGK-~CuB0`14h{`AH{eyf#+1(`+_n*=iC#@To>=^Ehvr+K?2P^hCTTpU7U0q>2 zYr?K@b4f_B#~{-YjWg^S*gQdvJf!m#l?`96(KZPGU|Wq*=mf-`+vYj|`DNHteAO$~ zun#rF<@zHFn#w18EFaz^iJVfdNc-V-8&Xq=rR=7~TC5o6n2dFS-sw;bZHE7*k z6N?P7DKB4qn0zYXM!(_O47ql|cGXxeIv>a2W*QiWKZqd56=w(fqTCvc)Eg0t-~jYpt3!VP0Tr=pu$KdJbrgQH)^)PU*K;z< zXJ@rX+o1fcTy}s3A9&sNYwEO-=JV)m~|(#|NLDE24q+y)mO&JVTd45BajmDf-Dd< zHzpB0Iaf2*ES@_o;)4R7_Nj7qNOA~G<}X_4uanXLEJDUpxXXv&|8gbJ|GOe21w{S- zvk3jy%^33kSvktnvUS26MNWrnJK>iO2w^^J+Tc^r;vvq8L~a{AGtPN4NkYd$I?~#$ zyIbqq?%mvNCNpI^bMM(t{4T6SJCszB{t#9^8SDoVhbj#sBU4vOOG1;bPKHT+CRHz@ zN_O;kzq5E#FanV8>ff*LE-x?dF0-~X8d18rx#>0e&TR1H_d1+^B;4dbHsxvB&nGzU zwq3jI{jvz+^`g8U&PX^xIavB=va2Jz2v_M^$fnj3ZWEB}AHxL1 z4sxlvO|LENfnw%%J5!yX(FamFYNxpbI2GWJ2u9KjDq$-@w-h|z$Q<~H{*K{Ju9|ri zr*C$u5jMrpH?)mAh+y8WMUBHToKYBSS2_if&-ttrNPzA#=ojb^Z_fjgVQ-^T!>M6q z4MF8mf!};AHF`k>@ZWH$uT`bfx^6lX?{6pVGdK7V@*1Qu<^)^LTX;f&%WhCNg*<&@ z(8Ze;RT=9YPiH4TC-(M;yF`v@HZGe=_giVymOe0SBT^i+Nl!GGO{;tF3m8FnCz|d8 zas1AVR^1p%O#FjOf7x<9n`t0W_oyCEg^{Q=3LIZBFqdke(;R$yQs>8U-enM=CRutC zlQluW)Zj302jPld6aIU|iTi3s0h-nNPhh1(RD}0#Xclm9;Iuba$ z35*{8aAw&DJ;uWgS3JsK$>Zxy42S9I?7#>eT@iLC8jKn~uVsuB?7mv#U0JgFP}Fj| zB{w&02^`gPbZq|^WZHUs;RMy;QXFSIVw3%CoQ;GTZ$^1j^UT#*?X4w#%~dDD&>>!W zG8%fJPp1C5MC&<(MXFdC_wJFpZ~x_HIqF4u%6ijlS`CT=ulvflOe)=B?7&IH{1ZK8vLhkv&>cL^ejyHT@uTbJsiCFaa%PORZ|E=T!ztQhn{U3gf(3R(tq2V3 zZ@_u^?YV7+O#|Ml~vndTaeF8hk;~z-&Ty-ys)1O`U zi^-Sg7t;l6z4a!U{QkJNNLE;`XUMD)^u z!)7IZdrqE}KlY9Zhg`L4a!TUOTL$mrzMa(+V^3kSe-nD>HHC z0n4dZ$^iW77qP@t+H8fvrQ;C4W&m-xs90p*q20tUc)n%fYgGlzFdfxRMdUZ)=B#;3 zP+J&6hqgW=E_xE^^3>#9xezG`&<_(Zc3_vOsxD(Zfwgv21<6)8inFv@ea&}PGIodX zNY2S`2}LRhOwi#o>#{p(j&*iw4-B1TT8r3e7M8M&rGHUH(YFeA(SNe4kDsf}4`(Rb z1Z~?w65s?!9jMm$_K+YWDVYts%f4*vpp_fZJyUgk3L9!!5lXyS_=>u26^Koh z7Z*BeZfaHL)Kk;>^E1XeU3yd!P=tCPv+bFYb{#W4=-uqhx(rY(mhGnS*wxU)dX zNseWK2e+Kuci)S}YdIWTM#_Tx($Mx^*&Hq3Xdx3yIy#29*{Dc9%UGp1c;;G~89PCm zkZ}s^Z4HkZs;&3`WhJmD`v0;_9O?j_l81=1g`bkM3mS7&p0dz4`eRXb5~O(ynU+VM z&)mlrV0-LC+(QbmY*GxXxIVin*J}^E+)eL^+K9&XQnw{?MlE_2m01?dMFy{maS5J) zcA6R(-AFxUcYtkoV8(-5Htgn=yPCXK^h<(cszcZSGEb z1eR>FQ-Y^^SGZ@W03U}FjMG?u-${VOF$z07CXJ4&1~pXr$;Up2^M)?v=>7KHh`$B( zEw_r+$#c@F++HU=Ro4nx65+7{5B9HAi za(4M2cG7ii);B_3yO{4HVn9^a6$qi|fih19Lk+e!)VD0g$9%C=VGc%$1oc&s!Bq)) zOKSR}i;gfYDfu|E8=pn(9h<^!?IJ(B=yh^xX%`9k_%aPou*Pz9ON2sk$|V|4nj262 z+7b^>-drK;C7q0_V4nPSFx&!>xmDC$kugpYJktXoPXR+=yc=;mNPiT^qQ#a7<}!Ip zTH9io8@9fJ=7PtTFz=-d$yWF~guZz9;!G z1&eizODZL7AFUGdz5SN#S0$LfxywZSt9oIgXo;i%xI1BAU*Q-br-6=DPgA3X*27WK zO%QB%Od{?*1KS=X7yJVW_70hlw2Q1v+%wA!57Mtx$s}+ z;`a~_6fbd(GjU)KdX_c%5RxECvxgCfAVGbz9?(WGC%J_J29`cBeF*2mZ18@B?Rv`VL;gG)aX{w<5pgpRKVg0e?LT)S4 zV8gs5Le!URhGV(~f(y)(K?BqS>D@7fI*Sh=!PLPzoPiY+(?3Vq$WZGxC?7pQf>#^~ zZtHP01DasH{!Pk2&jAblvIm4PpN|g5Uxk)Jgef3@Y}%E<{?c8XQlszZCqvZ0Jh;tb zg=M({5he|uqa1ju*l-CH3>ZpPx&EZp-oOISS&xwdAp+gp{~GW^9I#{;Ra}kJ1==IO zXlFZSWg#^6~x$cVBc1>-yWsXDJ*Ai~LA?H||pmkjs)e*+CEVzhN1I z^gtS^Llht%xblx>?`124euxVHtsVD5oOurk&|ZM`iAN3Ihy2U~`*9HY@fRk%VAnhGHM+!iCQ8YW_L^;TjRln~~8wku&`oYxR9G))D z>y-JjF7M0O4eI@dwsUx2kBcOFC^1hS$eJb%*3K>g-2ibc3UzPdNAgAKCiD0kDW0a! z5RGqO;FnBL)NVUQ8kC<_q=|lk8S>dwNC5uY6yi@D+eu3z>QJ_QfwY?taKN-H>>1%d zsPCTQ5F)LJ-QbSnDDutx{Y6WL9vG{>Bmd4O-YEP~amnq|XTgUM95?|Ip7u*9{;urn zBH#t638_u}2aaEkaV?H=M2eQYsGxyPK$LM25=vgEU}6Co7{64M{g_(lZ(3ncV0Zd& z!vB~hen;@|P{9KMfs_1qZJY=Y)&FiA_aCX)ZvV28|8t&5_CIRiMzwVvcRJAjgMa-d z1CAq#za>LB0I}}g&A4l`dbWUr(m9%eTC?)b^SKoD6Zeju^5+hl)9T9dCJxAMXS zr^xh^sLU=pzXh2aby3ViQ+U4>O#LNoUV#8ycP`0X2ova7>SN^-?$=!ou6uEX&9GkDVekm&kot8w#8R(HJktbLW?UU;52lt>`jWwOfXjut9sk~3F@{O$=XFTq0dl;PFp0p2j3w%&%Ub~YGy*~))X zj*uxPySz>5$qQGpxh9?3;7B5g&GMheMO;}g$KwM=0dY~c4)5WVlgK1{VD&zKCV^|8 z<-~UyP$|Z?6i}0!%v6KN4^x~P2<1Sh3O7=RlzGm6ZmM}!K9yW;VL4}1_pR-m%la;; zMHa*!VtjxHdYzD&YV5LyT1#Ro*w*VV#5U&2*m*eVf3gVl!W)@~(|ep8oSE&0f`#_N z8ByJ9B^|ij55(SDI}tNt`*7kEllpYrdxrwMPM)bL(oEvg3o7z(9*T+}VpqNK6}IUE zm55^+NxkFFq*am1-EH@=H@BZnZVw!q8E8enMzN_@Wb;bD?{raFrdukx{EKNrieN>=c>r*vh5p~x@Cz>#M4eyCn;&Z(~lEs$2%ak zObqs3cY?nC6&ocmcrkmu1qVX80Nb=t}67;;>^z8v5U!>ryZVgnINkq-jKL;PS3F;(lx)j$m;9CZqf`<_l# zULNESp5ZWOlOwsO3|tAAB8UDD2y_bd<24T>Vchn~$lATjX>h zSyGLt_)DKuPXQSh^QyGn0NW7T76-cG@P1Qe99fxjxiBYImvGByOh5agM|8SfpWJVg zVav&nZB+Sf%s8tMXU!e24Q}RDvk~4G(X26cX}L`lQ~E_1)EeSNz+@?~^v@U(j~PWO z+1Lh-i#{78Syj$1f{?<6?&n-(m8WNgzNLp9+*6a-$i0VYAjn9qKQAE<8(Z)R5EEa%s-@?F6?OX4eSu@_WM^ zeahH1wgtsOI!9>9y)>YySm2|{^xiEC>knUTTgI%SXnab8YmNGrF7=0j%j{t2iCv1>F2fT%PM@#A> zB_ev59CUN%CJm6~MkzP|Qp)lGR-_C@IM9U_@Y?!QNa;g6k`9_vS9XibAM4M6Mf)ys z%4&^_^Vr%&@5Ocoe7rdh4At7Htbv%=5Voi4Op;X89q_Ov3IMz+HXHui1MoZLR@24`4|;xFgFj!_=P{9;p=ct#PsmrJwDl;B)VLYfRJoDi65;rHQhzPTWl zLDr(+;k$3vF<#A7CUM6Wtx$R((8w!K66-E!+6{~=h(KT2gX{y&S#AS9Ww@Dc@Te}$ z4Ev{^kNt?>^a(jJuHVfm{jF5xJ_SY;rH>mYgihGdJfKHv!w%)SV10hSWez={6=TI4 z*=Y5wW+4BqGf0~It7FBs8*xt<0t@pTgf;qH6%*&HD>_%H^p)vlQSl5YjS zQLX-h#id>J|AHPkutHsbZ+Uno$yrr!uJRfJp*cfWn~|MJUDUxxS0>IHDOyrfRZ~z^ z@H_V=XL+UjyZXDdh!bosCP1^#0L^WHr7pz%Iafj}n=^-XA$r){4GQzDZ5PCWaU~E8 z?`8#5BPaX4;q=z7sPMFVJs5JMp@R*&b&D?5t0GOypyUGg+_dKGlyFnZk zp%aE?E=yeY=JUMH+=*SSFENgWW!-Lf^iNJx3Q-~RK$>?`7X}@Nx!|tjM5Zk#Ev}-O zo%0^MSB^?OR)zB<97JB*tDQKYhb(4x_a1u4GPV^n>;84_IQG`V7;M*0qkG?^ce+21 z$G9uYF)zs6W6*`%c?veGxl`L&VJ6;yc(N7#_n8Kx{V9I7!9n0UnGCRM5tmcSWiJ!# zJ#O&60bRs<_uqM2wVDl`S1$HPjpN9xN-3Z{ozH>%^#7%HiL-r%#h^zwa(`4q74WVHss8)COIb z?!8sD6d|81c<{dQ1d)VNTMA68?bjFu&?lBhH9_Q~me!^MpZ`-FJ=xo`hyRODmLvM_ z#E~43@c#jE^k3)P{Qo1F^uL0i|MyFt4z!n=dO89Wn1RNc5Qbln2)P;!ScnN55eXDQ zJ*=2__836rHMzR9P4gaI`X3)!w(BXrqvX8rtl1*IW6`yG*LJ&@b$RFPW09NX*mr3? zo?m7;=Y6lf+WW3foQ=zSbH(E3ZvU4f?eAQRG1J<; z#!7|@=R%xU728g=j{aopqU0hriU2x7wMuSexue|eIEg)djX&PD)pUxZd{Xq4vVz`C zgKBR))i4TMs*oiZVZa5S@A z-c6Tg%*~#M(p`oMRpx?Au-s$@Df4Y8(PRdVV(_iqWM(PhgkVXL@hxY?G<5MtO`=Q! zcr`9!B6Jei9qm-b_;Y|FW>G0h`u>G#%CZi3VrXzDD&Ff!?o858-Dj90RwoThr`+|HC}bq7f$we(Qjv1gGw$2NmP3lh=4O zYlpYXY{*+5My%wC4#6Jc9qN7Lh(x>C-AQeN&AFYi z)j(YjqeX-2oJOKzZLFdXSSF)G>^QDv&9bic!eQ%LPXr9l^cY+hp-lB#af@WY4O%c(vO2XiB_s2k?`BTN( zbaPZ=*z2Uk_9MO*%gR^}>0W)}#!otdIw+zjHlT9&p*`*AngbmcWZ|@uHi?x83maxD>o@AgA4f`*Imna^3*BjL4DJ zTyMJ9R?KvlP5-v_@|I#zT3-QYWbjs}go6}{y+4(hxX_*1dQw$D z-5D0XU7J$xpjNq!?fk;QDg@#zsj|b1CD+$S(JIEOumSc4&LjoaG2>G7nu-3JW31;D zoHUZm32UAL$*uoB(1D#aZEpN1I~g4Q4zikqAstfiX_cVnOL;85??O9ft6T2IEOdEi zlx#rzqhI;qW^7^CDo#w9onge}h|JL>SH2;|%w}x8f%jvBI%eKr*57+t+{PNVm|0GL z$Z=WT>RR45m~y?tb_g9T(ou5z8>$h~x_vNnMETA7db$jsIvy{zix4_Z!Y;@bN%jbu zUaG=f57K7;+ldAnLHoJ=$l0N$O=_z`DH#S?GJ8ho9c)%hY<$fU+PY_F=8I=_)Mk(6 z<+n-;!v(b-tbs>*gK0{`JlmgK$3MBWZ9K7AEqQhFDYg+E(hw0~lz6GZmG%3s1iVzo zT%ki-MadAIiZl?UIvFcAPE7sE-Iy4U3s?lPpwhcI(&iEJajpf{CXiiidij*TDy-nR zDU(8dKJcTUlWG*mG2={iG-E*(5AJJX#I<~~3-DiacMP6!Es=;Y=g#dC(J-D^M@b}? zN)@hzViHBf%=3r4$PYDs5U!AG#{nv<8=|jYNo^{31v_?#!Bgh~?IHHA$*HVFc@U|^ zU2y)vv0fXhUFa0m(|KhbPqkYj1KH(Fb!u2;;V4%^z&21Ba-->? zp~BBZpzNwD;l2-#G*DZln2LhsN!^GPjN0VSDwAc5r)9Ms64=tyPjr9pCuCQ2&FHXY zMur>)i?Fs^w8>w(H*LhIAQ8+w_H0J6RuOoU2E|d)O>0lO#yeYN=E_*nhyE|t-Z@GZ zZpj`j+_G)kwr$(CZQC|)`Ic=Pw|vXCZBM>c}@ z6A`Vc+-QyFYQ#aAbH@aGh`l4)A{_T9hJ`|Batk|j+SY%Q5XUbT6oF|i5@l0_ev~ps z5kecXc@CBgS++WOIfeGPZRlpDIA()ft8At97(%`&U3xB9WuFxi#em&VQ!11ii4d6J z6(CQDyi| zYkZqOwG!%(?tlSMuc(TgNlY*lLR3%{{3s7-D-y<3Nn?H~lI%|u4@PUFJ2gjq{m{II zUPa|T;>ES2q;%UwvB{d@X3DCrDkIrpkbtdE+mSad^w8ZafQX}sS}slCQaCzksw^6+ z8hDC@K}UVXB9+u*r++^c0_I}Qi!<#v-mEcqW3@}N2S8v|F}-;b+QjU<>(V5Dyvu#U zN-+3R|7jD%T4h7o!<3^Tik{c4h;*nj+nfFpCTDtFmW^voV_5Q_#e|A^u&J}}Zu($j z?b%e?Y+D$H=}!pB+6vmpv8A>UU)gs|vhTV5psLB@u|xK?e{hi+8+7+KJX=f@xp<;z zwY^&}|LQF`dragCFTHLrENbzUzi}y*uV`Pp(8-OT3^pu@RS9b%NQgaqZbnGET9qaZ zQCs5*Hfk~d5yu(nREq8frNX&Hy-X45ajqJjvm3!8(qI&!*e6TNjJ$_y;CHk}gL0t# zi^Q_!2#379O-=o3iV9_AKGGrYXd^^FUGH3v;c`j#(2l8x$-EPzCAkU?S$CPUd6mw4 zwq0k{bh-ivGtA3{KsO)n9?Ec)9QV(n2Q2$RlcSiE92olu9K=$wqe|8mAIhG=^aE3f z{b$Izt(*>-c3E-@l#&!aeE#*%k8^}+N2j1mFZLMPukYC-{S%yC73h5pV{hB(2zO@vG}1F;u&)1nmN{kkM%1ipJH})% zVO`~k_tl=u&#AGsbQyLPme2m19);0TV@+mbP=?IOnS5O7Jqu(X#m0KRl*qyiJIFA= zDQRyZ0k?@cHS9mW+UNsC8ZImq)utn(UAqrOM*HpXw8lg36O5aW0wT*2^+F6(@X{mw z1J8>Md{|NQAN~j4TRUXkRlFOkKTzZom^SP9uJJl74U^H)!S;6G(*aQam=Z?CPGG#@ z10EeLSM51k9}Su-?2k!!BuL0ZB;663{T%Jk?@!@y#fm)7LiRzU4Wn{AcNKnvKxus< zb2$B+|LMBFj3X{nwO?jO%EcoC2vVMpX_=3DnvYx3&zug+q)+-g5HuaeDIXy-A45~0 zmN6_4@=l+Z+J9i%UL8ED7p!UqG^!8oViYVNIF+A_I>clKWMT)L9Z|JcVFpHQfMEuh z$^Zo$s$z#-9e89wQyq+~*K-+w45(N1eR`Xi9YZ!i$pFb()ThfH^ShNmi$ADYZ^jH5 zUtpCz>W>|3Z~?wx0w7N4UVLE!P$7C~hkI*8#duI)Ms`=I`dS!KedN68K38@yzUh#= zZSPh9+Tf^d!`2_PArmt>9IZgr!4=z<&kWi@&zh~U)g!)h_CgvmZ2dC!OwH{ewjpcV zuC2hA!5uS~IQDGk!Cu?Ct#FrO?*Qk4U^@iv=&l1q*W|B#IV)@qrcVt&BhJSoI9$nO z=M0nz-d0RtyP@jh=to)*V7c7Eb`O+VC3y4*{f3ghh!Ykd#b_0??cJeq!^pNJ+#z#A z&9*h%VROUK^x-;>(ccmCyRPau_LhI{Iof-~R&A$X7wf}aNgM0w!?_v3N%Y4gsm~Kb zI}K7qupv8CYDDnGsqwZ!jx{AM|0+AjC6=q&9i1m}3@5uHy*-y?Rn9PaB7EW4!J=B( z2)`0~zY2C!tuKY&igTA_*(Jky2QVzw+^;AXdBF(QD>tse-wbh29h@e8cOZEKx(N#J zD1ICff0yk4QXK0Rd57Pn3I0+ZBbA=23queic_E0vOWjABb5BI%lWa9%v=VyR2)9eU z-=e%}LE7Za*a&?_804!!EqyVH_-fS5KAa}*E&#m&OIisF#}nbM7Tt#lM{%A@GGg z8|c31MtEmkt3kd2?;at1#a{c7pMSyk@b9RR-R?oeRTv_bJ6gl-LLl-**t?+s@9PP7 zR>q!nMvca(oHG;a2|5zV*`^Z9?Tr}_)>Ij~5xy`cF5T|CxD>G2ZI5w9csEA!geKPD zd!Wf(#{an_e%C~K1HY*Ve_D(f+o6g0g4kKLY_8=T(G_|h;dHR)$`H*D}KIl4n^_lhXH!lVP44U0H&m`}hl`daR6#qZ~JDKf419vSg1 zg~YQ<_sywBV-jnv5SHWlQDZcO8%r(zu3mhS*-b~f@MSv5YG>AUIVsjxVq}3v!CCiV zN{ki%oTZ@}(F;bR6vUOKAsyi-%I+s5MsXY?zznDTm$}i!?YP+%oE}bS3r_pA2io zJ>7Vo^kct)A(z?2cE_oSqwO#A5tfrFZtGA8o$(3a=}!?u22 zkEQd3c)I{W5Z%0NJYy=JG(&nHW%23^s~|`gsWMM5d8&Y{CMiX95l9|Zw{d_G?cmBX@d#4 zUW0(8qT@8Tt^m~h$z^u6phYkfC{S>#jXhqv4$V;9zujwaV`i+laOwn0^v*4<;5$PsXj8U2#D22X2Hc^ zH~5=;(ox+7&|3Z66+dRUefiHa1-0i2{+VE#!MtTcQ%8y$_N;6&vRiK@TO-}pHuAMA z!iWQDt!9Vg16D{Zl-7%)H-|tnYr@S8tRdu5;K%MX46V5U3)~1N@pDRBrtbkZslOIp z%wwF*=O2t(s#x^+kuysiZ)Op|vV zOjS(N67M6F$9B>NRWpqG1(Y>ve82t5g4gAw(VxHkiGv5G`}5Cfw2qSF;Med<0;;ZA>3}C?Tvs8}|#;KSIWCs-8Uy2mpZKTiKVF0{(#v01p2B_W$t^ z0bu;!gv>w7`LzE|@O*3dF{)P9*lH-7X6LedgASW?Z^N>u8}41rclCRwIqYyFCpYXd z4FqcSsueevm2T%g8ygxUu)72Vb-Q?oe*A(!<8;cpi1;eIaPoxD0rFIXbcD*=azB{m z$>U07)|||S8{Ddw9K@PkyWckMa=fN^oGw4S{c*2fyp`CF{)`#FUdHS@zq&eJ4xc|b zJKo;@W;u+KFY@^<=e7gaM^R|2jRr*R8>&=un=?C@7%*gCkaZ%ecsyNJR6=rx3=b0tX=s>CdZzq zpvDyPAya`ip+HqDmZ~x)H0K1;sqa*2CE6OhvKowG9f zz8qssQlc&OA=%eIdPCxy0O26x@6wP{zI2FYaYZNTg=6CCH z#wAEk1-cAl-n1wTQELkd5me{GM)A;yga&M3Xd=vptx9AzGtmfzh7BXgT6WiYT!}90 z!-rFz!V<0mqSjCz=Z+R}Q*^W8`hl{mZV4tFrgZqBWUz!*sMC*;g zylqql7RSzfIZ4qtSRH{ABweYr=o7Nx42cIfq}Frf8KrVN@!f{T_rWX#wn1h6uro-8 zFo%Y!!$zw868*H}txW`wT;g6sZR(ip162%Oi|^u+24UPR>tc=8sg>v|4b>?2zHOsy zE30pbN{+TwFwx}awF^S)n2WO!IO3vAbz;~z-YoAKYRd|q>X`R`_-t+2c;*a4yA&2F zkrx|&wm&;5jyf3Unwb+f#kB)C*7z1xt|#xZ!;MMJH&}l zo`~Ny<*5H@jm*0J3+||}#mh2Um*0|HkM>kZ>Pc)m8pdQ?qwBjX$b%#USF3gU)S3Jc zc6pZQPu6{BWGjxFaZIct-(-39bxCNxC@FPcgqUcgH~B_c32Xf2p3rQjHH{$DBPNHC zfodB?R%f_Hg!UyXt#ULfs}tfDzJpacJ4?UJ%ez%HmIlkplG3(bjEXnMfZanX_A}?0 z5 z)x&i^&@!AwoSU0QO*DuNBD5U_el4IitF}qPMNqmbQJh32gp}c|u&B{lRa#fE9jsIG zc&hLiDVHBat8Uk;F4lOxMn0g}wR*_TE9E`gj@b<^3TO-zeuW-&HVmRXDo$t_-f@n= zt)wn-5F>-;lD=22sXGx=Ih&gAW-QgEx-p#06)O_z@mDTz9j(4@7^TYEoChiTH9-$v zj)!E%G_5GxWu6~^KQlg}(qNc!>o71*faqwHVTD*@M)h|`Z$%anwsU~-UbCcs1o>Gm z<{d#l695Q+3!pa(U^Nan<@esz;&8%W_~*<(bmT+160HJz8Q`6V0o%jF_8G7PiT%X# z^zUUj4&h~oCEEr$4g(k7A%^yk^NI zuk+mlp|<}I>0Xi6A4&EY)x9dMph|+>ydiDaHoa8jM3V1WXMU_@tny!aWj#FM&z9mj zkOX1wVlxwNj@b~us78CDo(*TRlB5v*ILO(v5=S+_{4j6);E#sJR3ex~ZYN-0REWQ# z_Mg~46Jx%@p3Ua!eQ9rc;?MoYZi3=pL3h81K7mK7*V- zW>?IJZ=JBo1}tH3!rmLw279P(w%qJ7Zp6a4ZeY`Ou}(%l*L)&M=hQT-*QcXu<)y}GE6?@y6UKe);st<7c3REAwJS*s>zuY- zwPV%@{Y%ekLhBj7+iu`%i^DzVtLylICgQyz2<*BG<}0reqRzG1YpnXQByr4~=#$|e z@MAMu)=j&q=2JZ+?K&HhsU@l6# zn!Tel%rU1m+Rp8x<^$%>zG56#l*~xj+3UJAWAOM1IcE$E_8E!`nxHO1P?%>l*w;P~ zCqr~80vqxLUov?mEW(sXXPSWSkU{a3v&5VODpwFxuWZeYPstrf;0^?q4|x75;buNgAS4c1RN ze6I2h>>rlL?3#m_`zCpLfPZIsApoAgrG0;E`F|#T9RDWi`=`?!JmXSU{rt!v+gZzE znC)jJS*aQ&Su-vafq`_@aN&SvL}<~47&rxN7*CgnPbYMY4g}cj_T5g82V?;EW@AN3 zbB4*V7P+K_C;oG?ZtF(j#*@9d?`2k1tbwCtf#l`MEAQ_i=Mztw!SKcPrSpfqP23%cd@^!~CJPYh#@p#bV`Vy-u@CcjlU`$8yClf_B1S*Nr`?ic()OaLA05@#ACJx)k4u z%kL^`S^O9dqi?_pcM$plh#yeQ*`J10>9QN1%`_WWACJ{d8pT{|qvJHHW~L#ZQ;RuZ z=R!!I{SGP$oS(w%z!>~L8VuR0u2pqyB^{j-`**(BFiW`4uMirUP9p)|+c9e1Ql)t8U}fgt#!%f6_=3Tz9fFK9kOoy3>viP_ z>|kx$!jj}lzQZHl(C8FySSK;*BXu*AiBtQjp#wo9(b&*a>Q1ITP@j{`&c1cVLlWUl zt6^d)&}V2tyEUpGw&U4(wKqVFjGcu}=%m?YXMsedgNTNRY=xp+L`R7!{V*s)=%v=k zuIQ42NE(~kC6cPpqogB=*6b6mgrQd=3A(c1x{(bzPj!nNNt>$?)tC$uu;T57IGW~$ zj@%e6#2S)D>#T0D4Uq7x@mC#Put$Q}L|^{BGn zB_k;4-?_6e0RR8Oo&Py`aR2v?{ZBdK@7{(ePugLLAU}y^GbhmS<{Y-q&&(t-E|7CaQf2SCsV2=N0(DuhVQ^xN}&Vknl9P5;|-$Rq2OxFTfd`&@C&3%>JyFtve z5B%QYvS6KVIWw>03??~q)S7gdjyY(6*!4-=hMIFh-$=A0 z^8OTq)Jh_nkh-JZRdOa&#z5~2FFheC#_ieE)cBK`x@c+R>6Et2qNUNfGXUHG&6EDq zDzd?2`KWHC*F|d^%N55myBK6BRRiYnYXv^9kbD~i>&{t+C*(+>8vL%fUSG2#XHtz? z{8zvOkdJgzXwRDu+B|%hCr_7NwVqZ-j5{TB4U$tD%c*p)jc!rfJdXb+Te(Tt#R2X4 z9!*AlT%Q?*vk1_T&1fA#w=^F20!6qd!fChIKC{m=AJJP(_40$HhPhY$eAVJ7DeLc5 z)k~m8%MjU*32*%4(_dIv$0WPyC2}q5n_Wp+kag3ch8>$!`y6JSFUaMtF(|Q@+_y6a zf*`uDqJ8?me_^y4DLF3$5D4FvaMfYib_Ne zjsZx-3or^##Tx|jV-XY@M@J_?BoZeXM@lDQFiIVca%XTft%`8Cea7fZy}{aF_1d+eaz@O_Oy9^i}cPEY*vNctz*aRdIA z^Nn2obbxoo^_IkYL)?*ouhQw8&d!(o``7s{!DtV@S3JObOPrEFQ-poz9b```_*;$C zdzW9XNN*ak?9jsqARVBu?(RZsH=sMlbyP$zeH`+fV&W3YrfQ%Q$xBCsy%V2IFx>=P z-+qsHJ;u@%Kt}44eXSg1?#2EW;6E}KM$!Q)_zwVp+`kpOqyYH-Hgo-J)d)%A%CO2DWg3E-`k9XflMll2I=+c zOq;@nG@`T=?nLI?Dg+KD=7dLO?W6I{0NB6vd6x+zB@&#@p0nn3+0Z+_@|jqImcF-a z+)b$*9g8W}H`A{BM`!tzkFWC2>6#GLcr=B(RAtWdMxV`GE`-@eX*FTA@KkJV_3s98 zOVkc7g0Az79W6#;KO#4#iNiZ2vBUhV@{G%U^G|q?>y>3b z*84>%x)h$K6OtJ#3J@rp6b49!ZC&Hu*31PG&N0uYX1%qApzH0vw=SciT)=I+M6-`T z(*Z;Nc|yF{uV2Ss(Y_dnDCp{CrSei;iNdN&!V(o1ryop*;yj=Uimak1q6 zK26mO53gBv*jt3jwoAz>?F_WVT@)>|Z zAfn)ASNYfLLultOm1r;LGRjLWM__rm-;5IsJjqbmsPEhA3xCT%xd2fA*75(7fg0QY z2Lb($-I4#Kp?^6#;(z1l2Z?-k{q*odPri^9NaBCS^JK*@K$WD@Y|A(^_JL4iaaPg< zdwiw?lJSp+<$o!8KY96fN9h_UgBv!ZceU5Eu;*?<0M3xtSQ6g@@^eQVh%M z)-*1-(v%n;WJeI<>^#tP1|JB3(sHL)E&XPNU5(!L{jbp=w!U-)%QQaAgdELEf1I0gzg7H7^p3~HD zI|I{Tm+D0Jgy3n!A~N`{r6V~YFZIl+uI!#r0ovGA_9Ki=g0Xj;@esYOCJX^Y(T zq8E+3zhu4%#`MOM{vtx(fcLmuXFz=yHFF63ihjcOkCop~(OL2Ojy0I??lk|p_7DL; z{NJqnKgSpB|HB7d;`{98>5+%$8#h#I)*!9@e}GqjB@?7-$Md6Lhc@=zgXh!Ec?&3r zYm-!D4aOEWWw##WZTsy{S;%tPSQPMx)bDLQz4Q3_Io~SJH_l%fy)8S?O=Z(vwlVR( zJ+8RK^7-)WWC|cJx<_#MO%g!iZMKc*QbP#bo(g#btwZ`pQAZv910hNq~uR&~3D0^@bQB-2;m9&tU8C zRqam`%F7MW^$Kv_YRu>tf?cou{1SwTqaBW2;9CI(DrwU{?e8C#7hV%`K$#kV#V6G4 znWDF*Rv;(R2&M;&h8ZYI9x36!GH9QH$M7)oUlfRoaaaL7$bcT5TMq{Q>n*^ zcjKb-KvRrn_^F;h9ToC676%gfp`6Wyz}jm8vn*Rcc=&5!e3k=rmVv9zah7Wy0`ZoQ zXtEk1-->mYiFi6Y&V}KYwnb1rFDeK8av`{`|^%%O6I zNF&P0ZC&f)SyR-av4L3n%uX(~+o%GBkC|dgP@oCB2MjnUbXcH&if2}tO_Q1DBSAEb zp<$Q6*EW2(*RAYm7*{^A8N9ZVYVxOQ{3%DPt{w1f;Z-Fpki47@A4VuXmR3X>QlOXi zOyJH$Ph4ras_IhwjJtCuo0_-578CM;91PDAG%)uiNVP~e6O3s~*HyQ2PloaBC^%5U zU(d)>ZN9#S%yqE^!B3LS*ztIP_(y#FXrf2ZZH{{avQ{{OV_KL;$%f7$xKtD|_v zCoTWdU%2Y{Se=(-*k~H0*;bs@B>M#Y_Ax`y?O7fB*fVDdJd+%*Y;h&=re;Izw|ifv zconAsuDQk=bOn-pZ{+p}ufE6T9s9ufqW>oXI(5bWCj#zX5d9wnyvWq-9{CFao4*n8 zHtIhRaQ+(s8EK2FD3(-58glBK{tp7q{}%!Vl}!Z#5d}B6$-7_fLUq4Ni}G?sp1wZ5 zZ_gwB!^)9=R#^N0M*w67!2Vk+|Ca>wAK3TT>t7Cw{x6M~lcHs{MvpwQ^+pk#XFVF7 z6EzRYxh(X?3R-Mu0#1^uq#$zZtT8a${TA!3qD=2UdGaI!me!M9p^VSfUDMqmkuioYt@cJC@#d3b7(=c(++3a0vlw8YF%Ddwn6CT0<+6*?GukHOtFZ|7^)dpu( z2L#cbl<1uC>exC5Mzrg;#ax_|q6OJOX|`(uNk^JAF=pH?CQrq=%X`~3@bC<@C;MELd>xPOF4>;z2W&u>Ww@q66kzh()% z08Ia%!sDN_4c)&Cl>aXIe1Ddb>=%x#g5B$8dO6bmxj28{kG_O=k-=8sk?ZMNl6n+( zG{HWN4X<(Jx^*c#H96g~sbi=toFy47{6#Dx{{!X6Pk3YjKjC6Q1Bv7xh|2Qt5CZT& z9zLd|H-GQlw;pU>dSBl8Y+bo+cCyKhy(UVNGTH0LU!qguY;rZ0I@_DuUlDak330hz zZXK9Favn#Mon-BZg~)}dER^rXVfq%s(^s^s;+!e9?WLWq!Z!eqTq$<66o1a9-5Gab z%ZrnNo7*Qm_c|jAwXoNU9JRaKXuIh#Vi$LB0RwGPRLkqwYLXsEgC1TFHKp zk8W?YY$%ehTo2u`NN-uW-#~enp<}9<6Q@pPOL8`B%uyp^7ZY{Zsj4Hztgot~O>9#j zH|Z#vp?9qK_O{SDT`7vYSSq8JnjVbDr;YEzKM>!qt~O=0^dJn~P$I4~@Q1SUOj&?L zcL=rq^>wXD9!g6+YI@jh_%}jO!zVY}xhL*w=FgfeS*;yr^0fIhIbB*$Omx)Ehu_Lt zN+lx;r$g@z_ggtBo-3FQ@zgNSJRBQXW zeGYO|$z!3TelNkvm4=(F{=P0<$8I)avNjIrHop}ecH9*7ku7)Z)fW^i&#@0Q0F}nE zUS7vG=_=FVtk&SQty{MrXrv^WKTO5A&Tc8PZ|r@> zAB&fs*TVeV-kRiuBt*y{FA8Z)WSx_(HwGO`$S_9DkU5NRGsex3LyZq93Nof2BAi>f z=R7%r{1CL5J8(=YSNu?w^pq}ln=3}#AY`$?Ey8O6?F4#m+@2e=&}&B)rH8PuCgC9yzXg$DM;gRs9Iq0=3)c4(NImGS*ndX4LHnFD zDkruM(kXWRX6Os&4r4DQi_8^wYfXFw{Nnq&2Dk>KoA{Y()J|j_##`ok3v$R;fVF^Y z!T(G6Q@J3m4=sQTW%~@V3$POwuPpJ=gM`N~E780=@D?s&3ZxEqcr0CO`_BxIx`yFIc>o$t$t8U4TI&aU>tr=uy%wh(In9qhCDqC&ED#V;4XH+%O+QPXtZ> zvAN9K(CC%$I{+_#-%-M}@X)IR8=+p}3EMNh0X9PCMyB~8N;2PABhG%%vc+$|un_>* zjP37VhIIqGeHQoy_#&!oO=jN=+dc!&U(%!hQ@zUm;ZtPO{z=Tt$+8geo_PXN(9iD;haLU_vf8c zN%y%=pwZHTMAf5yuEgRPINBZo zGKp;r21S$d*)^$duq+aS^bx-!C6S1J-gwDL*0$o+zEWA}vWUC)Juk;VQQ12P3PI<4 zV9-nK#Q3vZftC~6*pG`8VWdy}RqJ&6R=W}QXF=2>Xm&Zw#XxjofnH&->hGQuE1sZANoNWvCx4M3^XWMM`rs0Lbri$*k8e z0+60}zY57MiW{rns`~x4;kGkxGfG#>bHzEQ{QHtp1m#%)B8E*SlJWI_CoqRwa9yL$ zpR^qftNt@g&3$IBU0l^yh3LVWy=I4=AtPXhC+Sa}l32_^NYjU(C_iG`=d z(JRJfXR$?PN#MxaFsAsr_r>sskr8!zSpx$n9H&bJwJ+zwN$ z@mY~PhY|y>TmT$|E&CZv^SF$C?Ta|r=+!sI0V{u|j77{zH=8Nu1#)tz!vJuu${+y| z(Q^l|C|%&fu1?T6H~kAph|I?N7B>Q`*s=&Ac)n zjN*&pdET-dzB5BxvATw96=$Vi#q`&PA!>H*8hv6q84Ij=12Ib}YC9$Q59*q=6dUF_ za_U*$8+Iel(_3`&P_;;}A)haSR;2SgI!KENh%o_DUMA6!1H_%16Fa%}TSgWG{WrD1 zX#KOOTLGrsX-BO;7HaYg=XpWVMyZ1&M!!c#xC~2r#HJ>se_v_fC?MT^8^S zcZIGp3I!6_a_5LP=V|c6B=&O&uGhO12*duYg=kt15_DU+D%{&%kuXSjNUw(R5?>Oz z^z|0Mc(q>la;aa^P?Ys-O*%jzG!G}JVT^lOsNvagV&bXl+?^MC*_T1joc83w)fX*+ zWtP)5-6_HT3Txnw(#!n5JwUU!^z!ur6YaWd^74jh5#;`A6yS&dqYEgQFC6=QjFMZG zJPzjOh!q(~+L-U-uam;I%8Oqh-&?-d$bSb*GXLhb@4tYhe=ZsRcl*C78eY!YLmp{* ziQW(O##pr;IupT_`wNowIM%@?Mp%4<=F~(`+|AUB6&oF^R2OHws&H6FciPt0^fkoE z@vIUYGIG-tAElE}<0lrYj<0fh*{oz_e#`_m5<-%|60)NK#64|KmzTfK$I$~^A3Azo zaPKCce3;z4Z7DjctE+9lM#(pLPVEVAgbIDvQrow+;HmPa&9)SQwKCM#RZFK$)#DI(YP7 zX08J8+QW(Ieu=bL&GPNh!ldZe@ACL^p&Cbx&>NoEfkOp|(mu6q`yp`GkmryU|cNRIMRQAck(q3+uv8 zNiQdi%IKY{#9H*sg+A3EL@ZV;S~TJ~u`6}a0Ymo8RxyM3$$rdMRgK`foh)aV%`)zz ze#81~R_RK=#{mon6e&X z!cKRmXHBrzSHTyg=WYcSXsE5lw`gWI@GMRBz=xi#z^F}uPPPYJ zbR{D2*3TiKX27?UX|UC+EO-=Zu+?!{q0|5L>1HOcG;^YjoS{r-wU(t-UZ^zPptgXs z)NOD+ap0g}t!4eynInj~b8PHo*-DuHD+Q52+DkWXGD~&_sn!-tBPrk9vcYtt|8YUy z=4d@#kL3hJ+Jn_JtFE%*$f#r^DQ=}2Bd&Ny2NxDo!;ie=6=SjZSd&=k1&z?VVqXSw z(>oRCnb^*~wq`C59!jT)Pm8%i3O2S%W8?g|)PXEj=6HFXF(k9kDW2X!=xIZyP@1)F z4f$dm+OnPNfD0=%+vSkCqSUmTGedhy#=!q%Sjn?KK8CJ(^^5>vk(!Nv^3=pCSZo=P zN@Q-t6NK`ReR<7lp(3_^yQ$x++Vr8pw(fz%qr?0Q4gi{bv17<)osihb4n> zGZQcTB3LV=wYS!?=4>zV(vj9|WtC#oL*`We92HSR2?N@=Z0JMoXKi=!gqu;e-LJeP zZ8>AZYMZIBItQ{O17VDE`+f=Gm~(4n?8nu$B30Fmv^rp$q{r}ETL4oplsy@g-xrEt zv^IMQ(FhZPIQnOnb+K9E=ndOfWi&P;Q0u3$lxY*zf5uuVpfQXMOu$PnFm)YaJPSR3 zP)_65Cs_o7XU@{Pc3tZe>5-D4T_wW?4106yh@*#BFa@!{sj`E=>?qy>qPjK!x;Nu4HrD{ZgXCWu)IDRdQeZ?Q;#s=zdq5p``nh`4i|2g{=_F+-mg@Dt%g zz6XIyB~x3iZ5&ogr9e3YTncG-LM0a=dY#Av)f#A*OMcAHXvX)(SZD-LZS+u_u%`d*hxHzV<4aE`qvt z_ZCj=+U%hjE|3}Wr5rgBSxgzZIfwVsX3I{?Z`q>3WJT5L6X4x5C|7BoA$!-(x0Pcq z)f%%R$ggeND#(;-4YKt=%Uyr3Xb!1eGR&xy^Ux_tp6aua;=rS2h!4FJWBsz=)#R;t zRs&2~v7u$FyHP|#sz;GQmmNf#=j=*f^wp>+sw-k4!1?{Vh~AAU3T>6VXPlqt&j{CE zn>F{LtL*m0QW<9=En>2KPxmiu4CP_dbm{t_)4D#2qZB)0=1X=13P;4u+-t4IG-Rc@ zhdvbVoue7#wQ}g(Ov)UDB2wfr%uDU5T!)z-g0a9{CC)bbMK$PDU@(MNA(riw%1TNK zN0c^GwHK#twsqAQ57OgZOp~m72aFU_$-mlx>^I6u+S?DtB+*#=-ZwJuo=WjW`VKnu zt535vBD=m81IdpnVCw@(va72yy)B|mS5yLMKb-G2lxz_N34X>t6X(bg(WViixoL>O zIKYFrN>w>OFqW<5ZIZ%SELJ+p7#HCH8)Q_J!*H2$g3b-#jPK8b+9K!>)lD}$xku%s z>26VG1lDWBHv>tRKC03q4byEwF)l;CqvD2orH@iH_oN1H$JyRTi05rqkj=NH`ypZ8 zOouPT<)1g+t15EtqHr0q29816G{!u&7DIm%6J!aj-KGtP33DX^G?tqns_rSJ{G9nhHzEN$8Tr_I|>r6Hbe|ZSjsk5$#FJebt$0wi6?-&u8AaPx=mK^1&`s4_qb~+AaA{ zLVLl3#}(Aqd<~71Lnt+Y)EHxZ_MaODs^dGUs6{mK&}@o1A*rZ)tO-SwgqGAa;Zq4< z3+f1M|53CEp((TzaADs@?gx=uc8>yaIN*=;LdGY(2@n^jhwkzBoYq;o>I#0_J(6{$mVbM_oM>q@;u~Bs1E0QOHD~0}12FL8^BqZa&^*AyGN5nh^Mv2{LS@$33p?6GaJ?S~li#Y9GDe$NrlgujI__Jll^7iBEOG^%Im zETNQ8BH+pfwO?Y&k;y~ofkn2KWe!Hngx?ae?<#TuFoKnJjJi#I9bw9`M25^e?(j20 z7ibDl&o(vf5F^AdcCRz;uJ`*I`_=*bq9B=8}%3Jp>TKC!YSO{-QC?OoWiYew*m@xcXxL$tZ;YN z0~|Q`rT;V0@y^`nclyTkrya3lf6BdL<;s=M^GjzX+5-qep*8tjm>j5|?GlQaLh7K} zh>7=%Bu9>U50PoWloZ9eo<&2#{w}sR`h3nY-0HXRuLU=L)j!KA%x&*z^J-)*imm*X9+ZT@?0cEht%4c}{sGY0>gkTKckOC-^yz4gQRzk@PRP2n7lQE?2RiPY*IEw7^)5&q z^eD04t1;Gr9N1L?anORyi>Pq?w1vI{ZroKoTQ?xZO?;8(6OenLpuFo5F(JjXIxkX4 z$`sTT+)rrqsB)Xk=9(BqPKO;f8P_ow)oIPp3tc(^+wYTSqC}r!!X+$?pnbr`qeMFXHX^mC9>=y z+}773b)4;BHIX%~sV4-dZl1f~ZmX$;Y)6*~hrIV6?}(pm!oDI37}yofzq<(dKh=N# z%SFHs3nxp*ANCeMT>iPB{{L7159=8@?sKC1Z!4J`$b3;3`>VX2! z*N!2tqHj;kGJiRB3@ZXj71;3*JO=b7jHT~7S#sZzQ(jhdoofosIV=;u_-jpFos-;y z7Mftz+@~ECoGZ#+p5|>N##kKhATIN>e=VjizCqaf@e2rymvll*o%1=mEdwP)jCSB7 z>zsjJKf8VFhmE72vhm5&^mV>5ErN|p|QMPo(}2aao;HUlpKn1>>&mty-5uJpG#=%n7$ zd=0i|IK$r`uGe1^VP0zzC3sIXhgZawMNAe=&dCW)7Cac-~mx1rVSggEaW_P z#GRV{Ht?|{A$0Vk6U97etz)1WOiUp`mYs^sd6vah#4a%%tZ)ht9kG<`U=$ zJef(z6t@>tzzMkHlW!y^f2}CQtbWWbDe)hGH<4qz=4*tjf=3FuSLpPiGB;56=EpoY z>lFlAEJkjV6kqz6J6DNq`3X#ZDk&Dr^C01tdyg$%*c?GfS6;94gJvw`d$X8Ly30-e z_G`7ab?X_3=HXpi!IT3)$KLmMx*8Yu;kvD4`Uii5Wg2)@{Z{Dsdt=EpMR5z;9B5~g z!pBpLvB2R-_(XxrujIUS_qo&M6N$23Ay;m6^XF?hZkvlJ9|I91RR~Wp52Y=J^=KPF z;v^W7HRn%D?K8UC&R#nJAlZ&TM~$|u_fkyGjxKI6_|cIGhbgI zIz21&_z_5u4N~63NynUD`g*g3j1ME_7ur(%B(HR>!|f&~5WB&Wfnc?#E@^~d1Ub@qz3<5ny_l1; z5*XFpQndVgqrQ<%f%#3XnDnmm?EdMX0WA8avocf1I3n!^{;H3$$vDxlqCfr9oACxx zdR?#W_L&cNXVc9{GGueIrfmf0c99bKy&2Sz$*kDVPCpH?Z632|7M3{&!dERU<-e1k z+HY5MF&Tu~iXb3m>dO%L;?ptlFtD)bH0O|c^vX^3$=)O==zZ&3nZ1rj@ISnJgz{>| zq8e9ag+`fbKe{#gAkvfqCwHU|5SVZ;Bq>axgz}b61g^Yk$m~kYGQH@u79otzfY0*l zBDMI*s)^mn*WPqrFTw*F8!vw;!`A8)u3$u3{v16ga&Q!9Gn|y{8K3jkhRDr|BnlrV zsNRUCtpW4j6A%=0q%4Wm^%j+gN4lcL>RM#t8EWOicVpHBhstBv<`WC$QhO3Alp}9 z=)!fpD(|>4eZV#c>7h4z&>;FkCHzd`>MB3JQL@xqqYOg>^jTv(kx_TyHhHW)UOGp)pY3uBkVMlwy>|hV(gAti_vnUngN+=%fb8*J6g8 zu*COQK9HSZ5DlRQ?fW<7V>$&_gJJ-ajWLQhM-G^8V7t1jGx-WsQ!aII4mggQya_gt z<>&0wtw7E!7=%N#1Y-XoHL;Gi%#PwB8U#kfS^szw%_fZUL!SJtZ#fYo?33<1w~jMK zDcYELGfF?@42V1xnOK#Fm1H|uaxPf5a4d*WSm;L4t`!BszFI_NI~e-1f44om);J4} zyG=lbFtT_ccY*mgw(NIUC}G}Ox}Iq~ZJy$i{8E`6Z)Qf1n?xb!ByL??R?rBCxqgJ8Gh#spf-nqdB6jztehIY_L@`~3y^gy> z$8y*C-)oLn8H(7Dtp|>kL4jFVAd!kt@hAcVl!fE!TeLTCsx72q@;+@?ab5-i5itzZ zzuDA@KTI0XB8pchpRQ=#O&`!DXch^kPsWSYvQ=1VL;r?GoL* z_Vp5&x|^LNhh5E15N#R2?s+<+hP#M#wc`%$Qp~bq4Q0k7@5!T>MqriAW$de#Cr3GO zTZCsLsFOhVLbKFZxj1l=h_1SQ#YD;27ZJ*Nwx-6|LtJvgq7Up0yr0f~j`p$5n|)Ou zgs3d&3zuyG%ONJxZ>O3Nw@tTFyS4N5jQXWz`|B`G54DMa>fC3{WV{HuCxmg@S`|dm+;$ET7?i}HZwqpaz*U$EA9{R<*M~Uoita=o78Dtu0 zxIopFJbABJvqA|*tq>%MPbnA6K1b7@AbI*F_6B^2j^dST9cw9$kU^+xCdvmq? z5UVg~=%dnvPIpDeXg(dd^`(s{yNp7ia;5QezM-pDV5^V(MR%oT0)Op#6Ef^e>jeHf z`|NaT=0aOdL$xk{eRPf4ctcqA^}%v|v|rgY0^3UR2z<20?tYoPF~~FFPKn-w3s9Pd z0Nvn&kr*QF`0)jyG&dCh5@|BcyQIT!pmVVXUcA5DJvB^Al5VvYcqX}IY0rD?dw%f$ z`XE+Px*V`aIGf05*Qpb}&=y?VfIb&rFaD+w;L_9`D+@?uHyypL_a{#dD%Qj&KL$zq z)N$+E6h%sMtpyFweTlWK_w_9_&?Y<|^Ryklbv7+zarVxNv!>S;oVNRcm`ChrXDXj~ z88H-hh~bYt38NMKM4=6K1i`Qka~*j1PM;GGkP*w;QHm0Rz1~Nftnv)S6%sMeg`~=f zzx3S7g}T@MNh)J4aSuQjzmCu6sdbRy4q88joL}d5n~62?BV+OOhF+qp@cinI>8typ znQsV?MDclmqP{ZIcQgh@j|qyML6(a-6rJ!lY|~3Vtm~MQ7>GZt(>@?`n3MQ%H=vY` z31*st{`B3Dfi7yJpO*81Q@GVe72jb~Y68v!k!oNNcAg&$oCGpM&-+no{7_}L^TAynr*}<<&oC|NuH3)m*H1b$K1Bi z@120>(BQ{wXW#(z&#;ppE&JZ{vN3 z-%YX1{}!3y^LZ*Y>f8_;AZ^W0eYqk2zAEI6;)!C}?*lJ`?;9xOd6YwDu7r_d34jOp ziwY3jOxy7@gSqaf_grrIOR=fj|6&Q}i86wkwcO##CrI~5eX==H(diJgh4nW@Vi zX3tTkt0n&o4L>?&ljniX#lz5XNn_APIzkgHgJ0 zl1+T~ejH<=w|_K5d+lVrw}@b1215U?MpOLn**^Z$a{gb{X#d)+{eSyEk~83Z)fc-* zF~+{&NQ;sR2lP<{nkW8|Pn3a`kzNtGagtyeTl^K5l%8pBoU)M)2T2#Dju_q2Ru@jPOq zG*&59(cQ5{aI?nsTmWcY?4COVBNaM{puRYd4I5ZA>29UNL_XP#DD;R)>8V$FKLU{!t9PzWVA^TO6>NsemILPS9w^atQ?MM){IXp(YLvdAO--M z>^EuB{=tBUH0I`4p+&Xup}=oRko1t|`O$RYiJV2zzJ^F!SZhmDK8zC?DxA+>t^X}V z=t>&0WXE{0-kKRR7E3DzplfjUm)1K<^2j#%w$43t6I{SF7=Yxp^O1KITp5AXLjHIE zDl`CY&6lU|@=*+qcOgze(65mrVbV~~1iE$EUAv-^!7YkKrSeze&>EFhq~Gk8T_d|0 zA1`L1a3)nUQ!^wV!&^P)9+P#Esr=uJF-QRDrK^K(C(bTpsGdMZ$|TkxI#vVfanZaw zUC9xa9mdrqo_ML6!pga_c*HW2Iv7DchBkxS9%EOln_;okjaH~yBSw^!eJg+u{{gse z3^+M!&>_pr_o}1!GVpf7XrhIGyi~X6&4hB*H>OgYr>Y}6;-DG1r$9f)CzXh#R5C;- z1m7frk zVS}Ze!=#0TE>)*HD&*tl`ja09Xc9}E`73*v?C4?&FCHUk&@0_4$vGPC(_%?IxLNK9 z2i0BgM!ZIRb~bP#tyDI14P{yGyg(zFezdbno=LQVjGNDxyY1L*UiO_cCNOHE`H$x> zQ|)G*qQCC$y^=shCI@V%QFZG|)mqq|2qxUfj$q=fIhkk(gTZfg=qot%1imW6WfZN_ zreSH(vbGh)RL%&4Ox9}2?v`hqyApcg1Ai6^2L7&PxP~63XcP2G6ReiG`a^0d^5LaB z{*@ngvPL)n(v+9>=)hr>}NCu#6Ez@5)Nh4^^3>Kgb`urxF=kF2rewgZo8 z9lHq$T$`AuzIibYK5>WachR15n~Z7J;S7@Lf3)8f>>kixz%+}ql$i)O*l$utsYZyJ z`=w5=X@Nq=nd&MwA&BVChgGQ3I5BwiJA5k3aeAdsr!yPNX-;8iKUs9O49cV5u=V?u zw-_2pjhOMXC^m_F^G~_5$uF(`jV)P_1ARL`c3Xt?I(&Fdu=}S8mo|SQbPa!nfCC7| z^HmIzHAv{TVw&Y}Ce>PB0t^sRS=mXHEuuL&Byfyv0c$4xwy`=U?Q}425|vQyzn|8; z5alFRIOD(55&HG_7o)fOb@wh4-RnB{0Vp@SXA=;{HVKT%acmaAW*ln^-Ge4O{bSVYGe zth>MLvb6l0!+_;oHD-~PE;fE?^?H9GX-w-3c)gV`<@2++3`iwhn*5+lTeoKB6U<&#%qj_j&J_jE3 zY~a~BdbO3$c-pG%>{#8z{q?AfG_s^ge-EicWj=GfYq5UW4nGx(fM_>bxYxj50K+$4qgG4r20q3LF;K zYltgZo(TG{cv$jl*-dxI?`aTdu{=&E&&0R0oEPwLw0?tzc<-Kb1+5w5e*MIYKN)kdoR z33|2srbGklGK95y5$){_T^Xo@N)_+)5r4FLU_hVPRBuL(p~UgC*X$&XJ>$pHD3cP) zb5mqF^K^v*tqMxPl*}k4h|N=aKG#)0G4Cip(9}*QonV>)bD!+TjWkKb8FX$~j{-8W zPgebLK1cBJNagGgK7Hbox*Ug-;OOSA18U*nm5h7mi#18N!;EseO!r$6Gr8OptWcO6ig6}4rA!5#WRl!x1EZpi+)uDUJ!1GO@SV@b z#~Nt@R)XF}id4*5GP`s7d(Z*bs9*eU?t{8*9Iim(_Kib1bRNGjGC^8kVvRGLX|Y1? zNZHXty;K3eu{?##aJ8&Yf2p!So3?Ti-wy7Z_noz{>p{;jUEDbn1?l-%y-o&r4mD%M>Qls^nu7K!1QKM*%IoxfU#zB>)jo28FVUGPC z`!k7Rcx#yZK4J-j%iUbGKSE9QiTJDs$5zr2Q4B+s)@SXBQ2iBrkraodeCzT=J8Ksu z!L0+Cp!@2kxN79M{p6#!&mc`^|2W2lN$z_85FhCg4l=x47;Li=#?0F9D+jws0q3X0 z<@apbA2(aM1Og@gFr_>sX!zYk7xx4_K_Y#K$URbX^4Q@sJ~B6wT{#e4SVAKAcZBP% z;=w=Vr^7U1m1n|99fG>>ZKr1+6;l+`iU?R5DRWlQXY4p{Np%|cVuzBx4!3=^@!kIR zm;VR}a?}o4t9GVwu9hy_Pq23xYBNkO!gRy>vhHk-gG`|a372d5XTK1z9vr5Kzi z)1WjO_#p}w9eK1+(~2~zl4vp(u|JsDD)h4Ah!qaIhp}_=KkJXncw`xBR0F4DSOOd=tOg^5w*?9Q#K6nPAzx*Vo)GG z4uL30Jt)M+{R8nb3CXNzpp`9+Lo;aDZ0gA;6c?3mn6X~(0!=Hba>!%&amdiQxow27 z)fNhIox#SWgO|-uSf3@2_mINPEI-U+esLy0EHgjMjn$R>4}N~!7bjRlVmxmhb1i+P zu*cRuTRr{b!56(CaL2GF^R5h`RIsgIVwK$q zfJ~K2yfdi(80GAu`HnV1BH^bN<_&Yg2jCR-vkH4AJ?Rwop9ZCtkxVF)fctTsH0e)B z<-PlaWn^;X5rYfh1BKWY64D{+YiP%d&9p~6d7^8_l6eauc0uxPw3t0Oqrzb*%-pm} zK}-DbTKQYQ%8>(lQ0}q3T+fi0d+6dhU%riyh;H(0W^=g<3q);BgUHJqr`6+w-f2%# zZ@mu)o(;mbQ`d7iwnC`EwosgoJmEN*S0cQ7%Spie%Jo4u(6vNLd@n`%ZKSya%}?lE zkh{O>-B|iyz^_tv_YvcANc+EI&{U=F;=wLkl^X^KLEsAeeNX9txfjdxP|R!e;@a1m z7>^_6&nYIJ3Il+Fz|M{v7Cuq_;m$lJuarC>q>x<8a&mCNFE_stKiC4NQ)bLT!;l?k zezb$N+H3cb_d$}1Mf_$3m{~jtoNa`_0Xrb!Y%drC)nA#841mjlxvln;J*)mC*>e8X zxaM0P3DoAaXE@F?1QTmS7>+J5?JO{v zztHR-hO+k*C~ryO@zW2&;Q8kNYPm2fTmDu-0CE(uQY?-(SyG=ERVoHdm#bQ!g@j`Q z!D(K}kPY-daPQ^vu1#NI&&;B9)7kQJz~0yvMzMevJJj{{F})GbYEb;o0ndE;kZ$A2pC3BROu;{~miJHp4vXV$uxC$qPQ^GT1Urg*K5zqHoo~{>Zba||CwK0u zR+*UJ$h1Eng9^R~yeguc8} zo~)^s1MYC`7>f0#eMfL6`U%k1sLG=AN@~Hj3}tP9*8b*Ye4*!`$jB2!egkuk2UcOM|TA2>>qxPpy-xsbSfx5*h2f86_4Dz(GgAcGQVqKe}rYdDqz2+Aa0x7 z7~u8H?7*Koov_kWbzIY+^_S_}kw{)hBd+;`dlQdbR~BvE|IYH2#|quAC}Xj&Du}aW z*_W#<@e;<87S8r95nElXYUQk*}{v&N+( z_wsy1N1P*{#|T9}juLP_qVcJi$3_s5yN&$g+Nv7#ez^84oBJ7MuEnc|yH|qAjTj#= zMF-hNf0F387N4~RM+_HF(S#zAn#y0CeEn$X{DNU75YoME4pwT=*a^Ez3H2F@)CWt~Dq#e8zrJ6{0>H zaNPh3{$WwOq-w@HEfafgPJI}v*g==VUG8je*)=Q^YulQn+bmeRkmiSY<)Lck-I=7g z$%osUG`!6~Ei@2xov`bNNSwU;hA2onXjIReo4AXB*mF{pvk$r7Yt^l#Efss3$m{LH zVBzaU#8J{+)z$A=6o>qxN zXf3E!wkRqt&FrLje+GDIey%G6V5|M=_T%OY;|wPUtS6_2>C z>)Uv^v;92OKT}W|8{am+xolrZQ?xEJENe@+{VRE zeq*4~9~Nerw12*rj5HUf<4;ykEu=X(meB2a;Pz$>8}(11F!xlZuZ?DAlt21b>DatF zL+9F;=uNxC^pe8(Z^_4=2YEFe+257z^D@WdFE1a-j8EHxdp?N+!y=v1pl>V}d=M5g z;df|J?#&o(w^f^G1wBQ>lv-wyo@nuiZS%!mZ1IR4^R+%=5OXb%ybZ&yNniB>pGgA9 z!An{vMgyyxrV;V5$$iU({gBAmNE>9rW~R74?vHq#yH~hC#}jU+5F;q!y&%qwVbq&5 zUs_>3W9SPUn4$jufJ1WV7?P+<5Ve~QYTeI%W#I+TT)_UvKaetO;xQl$`lI4Mpd zf_5bi`0TeCPzS4}c4ll6CEwrs%XIC}wy@EPrjI^c;KjDa{Tl0y3r?D#xszS_9Hwsn zJKTL1KknA`XKGC#m+j2&k5w3p*oAQEn5$qZ*a|U{I-`5b6JfllWH`zuu{1L;__KIK z*f2@5`*02r|ATb-)~<|Kg-9Jr4QZn)$8O5?ECHh2;dlmWfbr%jk}!LO-}0xR=PS+S zwx?ILvdr-wini6y1ZDX7E_3bb{uvfJNVVnLPlW&_$P-fvqf~R%#T486u9FhdtpS&lZV%asR zgYi1EElunM=|gT7F&)*q^!yf-(iPeVnYkPJ6(^SN_>L?6|AUv(UuN)v_Q^}x`?Tr* z*Sr)>FuMQIrTVXJHtK)7X#a(!5~@D=$-l*IT~?fz-@4|WDHl7<7~*7z7yXVZp^Q(J zDcO%6Trmb>DQ~Us=Ib;&tL7Hp+aW+l*GEO)3lk0^k0)*m{)UR~52i0%;1TleYtO1% z)+Sthg3$G2=JsR8b>^m6?DVi{edV%8EM4ecWoD@Duoir0<~kD=f>zG9cfzPEylc$p zDK|fJ)wlK0mlT)I19i6{4&J|;sgoAKH@6`SSHY%L2cv<3AK#kw133&P!GkHXFY(Qt z9#&y}J}=ihuzx6(&M#*o66o=@8Q!J^>oHdDHG~_j^dnVHobe1P&Gpp4?7g|N9(1ey zkVT?O+b8?UJ7DgE001vGCalJFUZ4Y6W7!~PDs)nkzL63k)OX4^WlT zVvA6kos+gOh9u7^Qu+pj1ait2%vGFUK6D6qL=rV-_uGQgXHuT@V+vGqXTFT`a~fN3`w`t%?dz$<0p}9?)Zn)61<4g`Tp3mg136*SSq=Ld0#Kda&{&N^oDbpPnaPJA|%kE ze{)cXLjp)VuS6<}EFdU9eux_uD81Sqd?ZygeGAjo@X)PftmsE?MRTo}(U2X4c?RX13} zxiYUJ%G(q>Vv*P1N0jnDp}3VdpTiX@EnmT(*~d~1UI|XvNR4P;4I=$fZs^AZihHiH z-eHD6Mj5ZdUtI#OBG23zL+f=L^ntmk8C%tiNmu)#orb({dgKgP{WacZdc8Xe)2u%L@@i(OZ z*s#VjNW#DTH^{e8|8~RrKj8Rr{gYb3!E~DwrewufP(vU6qVg-ST?8BZ|OarSC{ ze|@z48%D)uk{Eq|In}MIej)3`;c|4$7tJQF2hSf(KyEKuUOD5w$pD7hsF7Kgh%N3J za_NxsQ1~b$sbRm<=X3IzZRb^JPDXL-TL%G~6@$TJ^_NB=r0K@v9jPk!`1+@P?EBq(FcD$sTb487*yXk_Z`{1wMC%^WM ze4b_~z$XEG-$pa_gyMX2{inSa%0Mv8^<$i<0C?X_(O5X;l;k0a!lWttd+`qt@MG#% zMPFZnH)8Vwos7Ag*l+i>8pCZ2Y#UT@*;N}4Yl5c~r>bX@=M#O~3?TJ3caKEbMosmZ zoteI*kD7h8A~uX!syV)u!ZCV}+;O=()R&;+tzyyJz_OVjH29FlQCzR9eYPG@7tYJ8 z$igST)+aanpTNFRBXaluf8zUOz+nGvVE+vg=RYk6Ms_A%|M%b!$bW*lh_B#SD0`b@ zWO4|JZYHumqF7XQkL;*)=bkI+5?z4JLX?RF4ei9rR{3_Vx44ajG)^&Rvu#3EQd!y2 zQ(0zdWNFX}8psIm5U77}c?fRqCvp49sN?BZudTdhZtrd?V9O_q!xg>G*W>N~)6*&C znUk)ffS0}o=h4kzucV+5<+!2farGU*W9#Bwb^d7&Ydnqan3&Mph-j-ijcTX?yH{S) zL7}^R-#{V$?r|2sq`UZGtqp@9F-$_Ic@iF%eDmTm2W+i#8r6CTPQKu~(W-ZuM8Wo4 z?P1DcJwWEJeE>li8*G2M*f`LcIr*ADT2&a{(k$*~;c@O9i#} zoBoL;$7F#g<_Ygw{eh8{LQC4qb9etD*L1d}tXqqDrWrpK_uG$cSL4@iQB{fI2F`S0 z{zV?TRIKyd^9N_RZ`!KOm%lY&n4xsu0Z&Rfw(KmoEJMQAsIMrh01{zkyvxhiYUo#; zcL&(p-pLA4?_WNhlx=D#Ig@K>-N0L=+rIRT7zD@$?ki1=MgS@m@J42umh5UPA&uE!YD!~b*o`M#nRDvHTTMsE8%Cu zBpA0YG|vbY&^U#b+aLUaxC=WR3?mf*6J8DWV(Vl1nx0JLLQ33`hK6O(@wan1$#v-` zZ(0+3cJo?yc!v`=h1w9}O1^bPN!^DZq@eOO`IeA4LPsQ+7`Gn`JQA|_3A(G%7m7NO z4XD8z&UTC?X(Ssp?CuRz28Urdbk`n~UuoQ2UD4PwGy?c>+j{_Ztb6w`L!FCsA9q{; zJuw4Ca2^4;)pn2`CAM;Dr*e5wpr&I{X~$`bf?igNQA2@Qum3jNl}-Plqrs@|>yyv= z(j{psUm}+d!(xE zud?oa4kaBs+U$z?UqNn-q0PjtluxV`6Ow4`hc$;29`8rGEoj&R$pdtkO|j0Fd7 zI{UC(pwUW^EeaowGP(q*U|2S(*^rgw?_+^r>(qpiUlC`|J*UloH;v+b+#Vr4rlWgHUkz~FF{WKn+9QJCDSP_M+++db|> zIx^Y=)a3oo!b(lmw$Q_h02V%2g=i`VId$!hR>x~m{&2bv zeR4uKgyj82C^bQj$9H&=@E450W^Qx?Q-#CRp+0ap60qQTit!CE-HGdF zBsLq?*qQKdt@1;wUI^YP!q)w-4TFwFrsfC;Pc1;FJNEj3cWvMI2&L}}E=^!(g#?0{ zD~CeiZy^;@-;;Q7Pck7?t5Dv9Xwh7y@6&60ks?C}7kp`usOSRP>QWOK*~j4gQpmOv z`BW2h1s+GkNh`F(na?~strp1C)7~e1<~w|mw-NKJ-0f->VvlSC%*#h$tctrdiJ|1KQk~F>sPr(oVr#_KneTTrA9Pd1iTtpvGgs z$BN&gF2kcYhIkWm{`|sp;G7bvI1^5fPLjM%jO#4cU2Iuubyz7+-n007a2|#^({> z1c$rzGqF{EF%WTg=u59D@>2zE(G#Jl>KuZlwF&Q8X^;R+;Fjs8+gNAedj1#T7(QG5 z#HgpyB`$*1_ED!qV(-ZCEyZ>M&dZ&z5m_DkB!TQadW5uceN8z>)bVuZHjloEl7rW) z)=N;FIAdfLr%4GxHGhyU+Ru8j@m|Vpgi5}W)=;Z|&AlvR*Ad89l&6dMF8ewVpW7#^ z+yPF6BA=4-*XbKmLg;hNy~_m~Vy}K6Gu)7-524~RpbU_pK&gx{#YvHWrxjNL$8FIV z%+0rgu_b}hl6HkyBA)FBo-JHDP`=ftGWTTwga1uZ-vB`ujMRl!I*Su_I!d|C3D*vw zSHQqYbmV;rz~o08rO#q=MWM4qf7w#5YgwxDq0;!qxj!Dz0{t`CGfpZswGkk-oGD|n zrzO{jCruuWx&3W&!E@+kF7%AU2!Cpc7GO7(`t%r;knB2S70l%sN|RzCKk10=xMx8) zI^MQby=|CtbM)r<%e>{9tnk`nBc5upY{2k0{sARaTW*&p-exnmIy8j%j*xIh@Jq%` zP%De*>`vhy5FK>%h;BV9%u&(#rW7ZWs~=FMdJ;5PzOvp%2%^9|fDLOcg3YciATKNA zNFwJNx2>d=2^)4b+j6KTv(}hbFs(SvOGIX!4@>Jf^<8Sw=?)fpL{d-%C+hR6oUJ?h zA!%3!$ZS^IXYj%dM6mVaSanRZk`OhdDzDiWj!@&0DIfu450stu!L01$fp436hiUQk zA8Eu6Qvunr%`JBHjPy(#R}{Fg6piX-sGp;z-18oReev$NiUhgjCLmqaav*yS&Nl@^ z)NhovnBQWlLu8X=@^!CjQUYj2z-tHKaCA;bIgY9p+DQJ?#0ot!ADv}%46f6=a)ZKi zNxtwD(M<;UolV#fdScb}bRzj~WAJSwps?OCfAEyos=7$b$YnlTt9PZ%E&RnekJBNq zx1h5CafOHS^W8XSw|9WH%ryj~WJ#GIZd2%JSdh{|tcuf|jqhW+ZyZGNDtU~plm}Xd zP3nAMo}yEOqL7e=-x>#5(=v8?n4YcDER9)lBW;gWe|cZPfSK_4(a2i!prHL7?zgkP zqy4rKF**(hp`b?Xn{f4u>5nC&P=Ez5+C{QwBkMMyqBp5R>+7)BPN+0X7i#t5_z$sn z`-W03QRHFyq>|25Gvo+elTzeCPTxawQ&MaO&90?cOpLTcUP*goYEn5*F7})o0g8BZ zqfnd=sQ;+dIgFw`96q)Cot*!!ic|wb`=2Xz{{Lm}I*gEC*KPIU=)JUlWQmdzLOM4ULcq4!rQa z=S-p!8(OPIx88a@Xs4n*oGHiZ{?_KEEp>M;YBv>LNWr^tjgYNV)G|qnNyq9ns1|h?AW|eR2O1lJ-dp9pHNWMvdb4^gXC=XcH4S>d5yN8CoK&UTBviwM zxM?hit|FXaF2MA_20Yc;7Dd7qlRW<1mK{Bg+MBcz_i2q?g>i*As`fm=DbPJ_-Npbf zWY1t%+^lkK1JC~6Vph5AkPXSgEh^voP5)U|Ru;3cmU9J)0UImI%%tDWN;19Fkw$^Wqa# z;MNx2w;5aLU&Uayx6w#9#k93$ zvOs@Vq5%ylBfArt;#xhYobmejUWFOF z&#um4%9^``@8V-EwG>SpqS0z>`i#KZm)D&%o>Vz|Tnj6*suJw|UBiun)HD7C{3hP1 zvIe6ySd*=XVMC9vJ~2+i~-!gi(?_5F03Nf#f1fSp>fPuZAraWBL=WW zIIU#I;4UBSAwB?C%dn@mTvwv361sS$o4bbTP+J=omu!8=$dT`<&t5J+?`pBGXgMe0xm?q_HpBS%sPMRh@Jk%eWD zBCi5yEyf}v;cTJ6hFYdsM#dW2Sn$^4T}Zo$vgyN{Fm5SzYMjy;BRM+>s2)B?{{l|Z z%4|YoXFq`YjlH*QQnwK`boo@|=8HB$9EvUg@BXQM1BwAU<6HAC9>=O#&EEyYCG*Of zdJg>f^T8-*Jn7q}1qw|rC1SfTrbnvYOj*X~hpacP{m1uJV?U#O=?}FNV zE0ibm>ecGl=tp0gz+5tpu+oCC^y^{hSqw5MW-qtar}lq`EdIy>an1^eMcFc*@31>b z^8B8}W?O9-{FLDneMh^{DNQyF!x2eqRHZx-z`}@7W zt9d(rXJ$wHS6fo5vht=F-vkNo%@v&|)|qt!mG>+~kdA`lY| zI#r1bhSSQeTf-AX(NqV3e=v*!b#46>CvWbe@KmGDa%9uODm9(IvFBB_fPY?U1{mem z(~;Q9g+p+K$n@~!TQ>5wMd>AOPA0le*27)yi;&`D;!E5>^l8sJwq1-@U&F7~xu^5( zCkJYbvz-RREu+_aZk%rJ!X+@m37<7lfejP#E+=lkW&Dzb`*dkTv`rBFqcbkmcv?e} zA3s{$UhoYJ%(hD};*$L5vr)uND;OL4qJ#w-HFuRs-j8&?KS6C!NWrSadh)k>SzJFV zSdUHJaSn<|>c>=QJB%67tl)Y_p)T0eLOC;M!&}N&mJIl~91ygr5O3(;l$1fEDOZb= z`9{oKtf%a9e2f^{lTTErk5xLgO8R(Q=Zdv+J&W8jQ?D33t(>c!+lB2pV&owc$a}4-Onpu`hf70c;^_BEhndoy53Tk+e z({Ai4L-hZ|n|6ZsQZ1|U1Z219bA=`YCAJ)2$nil0n3Ax=85|)Bvy2I* zr&nRL6akV!uuhFsM_#e-$i7J!aW~h93BQqz=d3FkaIUXyH?efW9quQ*57pkmdb~Rw zY>1)=aY0~x4^gnER|OXIL7!`LOWSIdVe4B@T-ZA%kz>)0NlbDn&GUxG4#nQO!CUCU z-{r1;9*qAS&UL$Zwx|OkoQfNk`p(c2_bs1n8Q=G^Bm7%{zo_I?7}^Y`1)xXg(t~D{ zTUwV`qjv2Tc74?FrS=l#yOLO)YBBsy-AQtcbF-^ntHd5==%C$~%^OMS$TvJPUQ8+( zIRetj*9^2IZgE~UHqoe9vhlFq`u@=LfXV#N2dNJGh?00pPM_+uH1`#18Q8jlG4L+% zslIZ#RGV*)Htr8h1c0>di}?+`r6Bq~LfzETMX;YNOF%`u=gR63Y#+fp-FHbyy26Qc z7hb;L1Jc^6ko+flM(yxFWf8+DNk*GA?%HZ|KGhJ7f1SdkNRe>d>d!!}O&!v@#R3*X>x~BB><%*^9(XmK7 zu{-URVRII`$w8qDS`}KsMoB-J{<0GJ$k^b;h1*tLjV%3a&M>3Y5@qbaYg}KRS$Cvs z-3NOQ^A{@KKhs>@Gt}Df8Ey&GYG3)beU_!*Qpu>}XKVJIJ{rE8C@QxVM-?KTdQ>xF zcQg}qsfO65C0(-{_1L~1-JO*Yh@#c`Azq_`RzNJ*S9xm5ObsKz`@ofJ8G8{9 z{)C=)FJ8g_Lo>O0cTH9ys99wRq3t-c>#|#Y`;Xx+Og*m?!E!{6 zP0f@70e6ElhwM=@{jfOKGM!EEBQMsR#+N&cDM1$fU_Z1h?Q&8OBC)Q{O@xP^Cl7$) zYTkqMhjcZp?f7kh{hFi82IVs7?=$C?dMr1j@?Bi3C;O{9&=ouCvEQXN`ROR&s*VszEO|$s0?IgH-&9m&HAv7bjq}c4^&`uJ)>4O(2W^f$}iy*sm399fuq}zWC_NqjsA(!eSD8;kml$~ z)OD{5c5{Q>izTnq>VC;$>m&#@%JwH6To#zGn1@9541CBYH{ZhZXVi}50xtX3;nL40xxm{_`JW?gn_7m>XC4(Wdd z2^sSD7pAr`87|IvFGUMx1l-(mMGArcDWvINhO zy`;?_v`wNVEsX=ap=k7pj%D9>s~ytK^r<-%4&LhVT6(a?o;Th54hwNo`h$}0FORpi zWDfnR+^(S~B=s-p#uDdqndLwo9Y+61^HDBf3}k6Ovb)2TvQc3V&Eow2Ig!-*p}73) zTpCe)y&ZZw99Sl6Oj6bMZNu=O!!^&LSL_SHX65lJTA?fmlnwb_Z( zzh5M%$qu;zW7pSM+T>yz=)Bzfcq9ecsvOL?FjQ7&K}d^FDk-p7llAh)4TVnC#gUBG z0#s18EC%PVj0g*Saw@I5`Rh5vs9I9UQWC3o~Tv^XNfRAT9z)K2%xWOalg`%KGIMbT& zOp^^$3lyoSTf>+uJPnB2w>6&E2MC)|oDc?G3q;l1s!;U1wa zuBR!RgcC)hU1?y8$VJ|)wxFRQU9E^kq(M0lTj$v3s*GDuX`g^KS|x?#wme#{ zz?>;weI+;8lFby^Ysg<9MVl(Cln9>z*$+iU$I97v+@V)9WzQh&C`D9e%MMWbCZeMt z0<%SQ_EsnWN0{l$becCaaWV`8n;24MTI^P;%m65$Q4o^m$SqTqy1b8f5ZaWDscpW?=? zRE_OsPuK@vgo@2+w(R(N7n6`lg9q^olJ!s|*afSEKV5R=a5&5)5mM$lfYV$=@DbD; zU5S#VlC*FcoE^8Qi`AAeG~;N27+}iW_?Vi*mn)omce(*W00sm{=w>f8fCg#>8Kh|w zJ@3E0bjiI$0&w(3_$dnm7MP@ef|m70Rn(fNAws&@3a3;9*2are;ZAr!;-OFYv)xfc z>uHO6KxjcvjD??9;_lo){cBJ}2$f!+JBpLTThWSOJ1enE*MVX|?;qacpxG*9bTTk1 z6_aUf*z6TaoM7y*MY#}FZ|1*3KgygRaDT`yAvDtTq3e{BpPCin3jx->aLtx6h3B+c z5AC2nI)FLiOaMOYQaX0nTGpT|Ec7q0af37re_p^{(ge7-_&OkWz9;JG92p5BjXSg) zeXdI!1qzfmSr`=W4%98U$f`%KOH9KpmH4q#?nS5QfiZ)67^f6t4hDdMtrX*3m5Or+ z=BpRrh76^zC*}xMB@cWeu`n;Y7+n&u7che1It-hX&36`NRtkLoG-b*$M&*Q0f05 zl&ga31iA8vm|!F%@jBCoaw3;og0`Y87(wZ?W?g|;p-LcSyFbB@uo0f-VJVR7j!Pey zHK*r^1js5-R3zIwb@B?hH->zR^oEEjP_%VTd7xJEI2`AM?~2;YD1}gEf!d7wVY2Bb zK1PNhMduwyqL|tzEd#pBq#Pr8n=j~=HvK0$;fDMa&8W5wmG_6Ku&lGYbSblFe+xR( zuv}F1i+~$wQU__tN`p(Ri!vCJ0((1P7M zEP4&PJO`3b)8c?L{k&r@ahfao26~8H6o+RjDzvInGuMan5F1GgVr@m4je$?bfki}? zW3++oEW=1hR*DPbGjJe?;(3?S(Xj*nx^}mMz_+RsN(@*-obR75mkL zb_gHw{!=6Y`hYL`K6Kj>WX-h|v6&17TsLK`q6i*u%?7BPbG zzQ)KjjB5#Ezw?_BW*{s_+bmvS~43OSGl_I zjQ|8&nckcG2e>ru@D3B}42JvWcu*iQFgTnxxhWO&_kuR_1{5(-)bNMWcRv!9Pa5Tj zYB2LGS`~??v}82%)_5RVB4jp*x@@UVHoLt0(l{eA*3gw3%bEfsNoI)eC2?jd-8hjR zNApW%V+KB4FsdfVf~NJkEJ&-G{XS34A!lMbFQ&$eJDYc}?UtVP(R2_ez}mnat6}#k06U|Ka8g=esnyrL>=pQ zYBQS&F@$~EgB)<<1sjM=>8F*FxJM}R;)E-9>46ro%FDzY7=+JDShN803LiSQ z4&)4S$kg^6?=~<8%5%E$UY)v7!BIu2vblsP`DIaK8aL#Qv(*=#h=u18*K}uJkOz`> z0PK{;3wO~VnEXG%s^;nrI9>R73fdwE(n-3TZR)>j#KWR zDH9UjeFsCZKzQZJ#0*~iN|!cUMhy9mMMCOVq8u{tO1{g!KYU3)na zMg|SyYd!<*VoEeon`kfpz>OR)YPXT#4%q-M4$=*AkJd1Pd)4MHkSS{zlwc53qh%5Q zB(qF`Fn?Ex1T^nFWIK7_?o(0cFO;v~#$`@JF7)IB^XbMz*aieIg9}^`B)i_+(2kC|i&7N9k zc-WzlupY072XtXRYX;xN)gJP6Njg?&D;s^F7B!eHD~4RL9C9A&y%`+w@}HI#(}8po zA~UkuTJtniN|&>)5o=8nMNy{uvN@gISomgyK&*Z$LDs}z3IKdk=`rYFPtxU-p~nA zzT-U?7%|V|21#CpegMHReT*5h1JgU$moz^K!N`&YEHnBSs+W{^x;EPY=$<3x)q(sj zCmMug-4`kyxp+=yeJgC>lV>J##RmL3^+ZXctX8kymYWh;qR?16aP(h zPkIL#Ao<-5bAh zJ0n7WZ0Zj1L*L+L!{xgY!*$~bbvQm9@v@Ps+B7KE3YB%24A$j#ejlh-Pv|k3>^70* zwhUp@`%|-^tC1L@(B79;q@o_DeMLZnPEY%O2W4+oAPrnle^IbYBI=atGS$m#m%0X5|8!k5miotXQ3L z@t82RK3o(7h6{2+(%X`*U8vdSye8@0CZDYhI0ip7?!~A%`Y>lHp`R_IBPQez;mZbS z)2e2`rX9M7b^~B1)9P&|0G4X-u)hvjkD;JGYJvj5a|p$s>yDs5=}HjjOG^M}EOFqV z{X+ZT^OZ6XzaX+%m5b!yq!5>2)3jO5odLLuI#7K|fZq|q0tpkgfX2~iR?FDh)6$@W zAx)N(O_6T!A}WyXRN+jl`Fs$8=&nG34$169?J$vEf?@fYDQ6#4C3GoP& z?+FSr!C7z$uOIl4Q}56ar-b*36*A^;p&ujNt4NU_jcPv{_3sJ9OG_Xh&%?JMgCAdxRCv{G z7=2NeqdL(X8Ny3_b#EV;PP3JVxh1UTRe%@Mx_vPv0OKPNmWC=P%j3H=A@7=KAEAzg z0L?RyhOo0onn#k$VS)=U8H$47At(cUaR?KRhHcrDa@#U z4Xgi|rhN4XtO&ZpRdOj`2SyUUvH%+P8D`a@)A`ah*?p_op5Sba0-VQ{JR9zSXN#5K zggX0iyxHuTM&K_zZtQXsc%6?5_ANyLJZ=yGM-yUGpj7T7rUCD-T9{D1?(ZU&h6S`^ zq0f+G(5eeGymgN#;R=td(meS`!L@kEcvqrhl5X9RGdDm{fz}yOP#KSfg_;8$>PQzu*p_V_?TlL1R!wul{Zwcb`YVPC2|`S$fw0_3e4wufDQUgSOG(b zIaC5K66h43tR=&KP(kvCEb_di5Y6T=ba0l&eT6A{ZY&j)U(GQ8#T)E`Rw8$5-*?iC zr79EbLQsNmZr_LgN3cI?Ocm{j^-spbU#5Sw=A`UN1-oEFax0+8+B0y0ZHETPz(~k)=!=;vg2F@ zFS?((Dg4v#=2jcw2ucSN(flDEW2Ad^NjhhiBaCB}#Hk4#p(^jBXXiDIh=D9eG4I#g zvL)fXks~{t+&cyyJNyqd2FL`NxTaP9aML@PT8jps-v~R$mQg><+4&U&h?jIL%Z71b z_#D4AQ!}Y_)&V#J;I*7^-`8asBVdlVS6{6Pl(CwW#LI5%l}X^w zHlvf94Jv~2T{y$M&ePXXVm8PM~X6 z8Y1kv-gUZt!T(XUN~YhZ{(^#lRR0%h)&IR!`>#D^|8MG7P2LVq9KC%-A=U1FfAz&R zpn|dNoU)zfFGPsih+@rYyRuDmvWyweQ|Y$F<<=TO$96#o_XR;104ADF2%0f(CoBmC z#`z$m^9N`Wt+O~Sv{%bHch9%=`n%?@q|WWP?Ov{P@bD=rv}nx+hjXmzwiPCIrsaC| z4kmr?I*q=Y`9n=D5i$UkR*Kvp{NO^Vuhp!J!%BX6IcvDw!}I9AimRi(IZZRl+QlO$ zN=KeVjb0hSipviY`J-1PaWx;7F^5XKs9NzM`0$}6B=Ofn2D4>>v!Z(0T&opPCdcCT zrBVxRbEYQ9I#!$oIxPBc@QP)YL=l|gEQreBM~gOQ4D;>mMOJ@^NT zDRN<3<-O-_07v?E0Teu{m+|)F37v0)VrC3AlcG)1teDpczgW#^n$3A6rai2{?T4g) z$zQFhnX8&n1PlcoWKc?IU|xx*n@^b4vO0yJ9*-}m2pIQW@;Z9T*RALxA2BwXKEzlt zg!M=e_%O@QNDYo{qb4F?xzi`qYY|jBN2rk-+H^k*+R)}w*pS0<9*t|ipbLxj4aV!b zD{#!xW#Cat+3W}?7G(DA{_bKPvAPrP8+@(YY~-9()fVJz5cQ1gCiu0>$&@sIiv+md z(%33rkv;YVmM8HKp|oK4kS6afkF2V-ixqG$(~Q4zFMcFVO&(OeSs>wUHS)&uuGGgW zJp1sSS6a7n$sQN0(~-Xk-3OP}{B*D@&7>7Id+~}L-Qw%5N_tbH@A&2?BJ4zxrC4U( zW_@^+Z&~2iJ|C30UB^z-wlO{5KlnBoGfg*mEe!b@u;KDVXTQL>LC80~Muw}vKD58Z z?$u?17w?~1-J?Hjw;YGWg_v1$5!YU#+#mmqd$&b06zlzTfJ!%HFdEbo(?FVNqhIiQ zYXW{|I*=tABX7u>KTL7Qm_J0a39cs93n6hImOq-!3(nFRNpT;CKlb>Be`X)DH!Aan z)nKp&dsnqs3pDVQP5!t18COcbVD+C@3AO8-`T2)|lve@bK>3%~I_j4MVnw=FR}>DY zCut%fsB`DW28z#Is~e^eex(PzBzLg!91ZOWp9ZdZkbPJ!9PWI0!8wm-|Nz@`J(?C#QYWB`8{+` z5AvzK<0lgcdPBP73)WCxq}bmN!JVIg;7UqB#dg~1rLpIF>UEdxriWj#KfNXWlPQ)6 zBTzSKD=mPEq93_40yU-OyW!_Q&8*!kR+j&QgMb9X{AaVS?0=#D`)`O>+5b7|{!jg1 zcmfOD5CBEoSCOSurIDEid>b$~#299tV&^u_`^|$BreJ$3Dx_%jeQ$uP(3+rn2vxwq zzA-=&H^cXo(o*vf>_^sZ_#*bINVS9#q(~!l7RM+xBkIv%jDRHx?cjj_bH+8h*-)UEzV0(>T|I|g2 zJ0lxqf9WDIzwYk;5S)U5zlng z8EQ(aNg1lDsYokG8mbA4$ca0HX#L}Kok7E$!DK;9|9L8mHr8&8hECR|wsz)lChpdD zW`@=dZg$qLZg9@v)cVxsZYr`MvLKPp5dVDpS_^lEjAZ=BRM&LdCt&k+ynihJF(9%a z1pm7L;rM5%;QYrhnA#b;x)LiHyBOP>yP3PleSHgRc}FvMJ98RdIAUT$L#O|9$kou0 zSb$hp|DRh;+$}7=0TB{46tiKC<4KX$TqHMDTIvoka?HnsIMb}=)w za&)x)8dr33vvzbaw$uH`j{iKItF@2$*T5HwaQ{GQL{6kB=?kHMEdMb|>L3jNJ5l=A zvZ48p@%s0K_W$4dLI1j-{?{u?7X2<>&Cq%&T@yFU*1*ZVqz=NbWp`@rN5Y5dgFJ z96RoIhD3-7yjsm=Nd_=#$H2SJDMvgR+(~RiG8DJv1bxL=pT-XXr5K-&8uJHuFWR59H@PeA$_V}!Sa2ZuzvXlz- z(6e(R?8>JOtLv;g?YJ#@4sR}2Z(RJSxAz~~nVK50< z@b-6FQbE|{#HT^^Pu6eM6JCz6??&k$HPObwHTUJ83bKa3hUVzv58-+?^jk-qLS7xh zC8Q8@%K#r`h17q`rvU_0aEA0YF-+2rXLhNI?K9A_aYw0DOOR<#!z61a7Cu8dMG|CCeYD2 z4*q78Plyg8Ot5A}Lr=$@0zBW|84(7`87q4{QSNf^d{h99@jn(CKHF5_J5yr;*`=Wi z>q83mTw?l$L?yG{0zkt7j5MOg_bsMjfbaYLO26Y<;a-M2Kx|dNfpZJ6*{bK+hh=_);p$@kR#~1Qsf%t}c1(2!Z>@ zr=XDfFEG$zmv2*I(H-VZm^7cOzK1@47VN4wijB(wlj5Ca$Opou)vb=ki0EXP_=J@Y zA4O!~GjM6UVAh8~Vrr~@E{95g?LPEO&~@pk&xIo>e4yHvl_%s$y2X{}_6jn-d>rO93E&!k z#kY?K>KWV8rDOq9WbQnO#73+_VbZW51WSvTEJUs9DBCYgn{$!Zr8Z8ZW$9&;$PHlC zV5XF$yB*+$+IUfSIB6=;8-6m-_Fz^v{iqXz8DOlJfH7GngJ9{V*2+{@$48K2Ou-_H z#xneca2LVge5Y#epMv`nNl}vfCv9+!N}lmgpi>8)!(f+7#^_T9s0X@zi}r9T0k<$@1)+ zh$lu*by8{xc3<@0*2wPATzO*_#L>^$UvHWHCnIQlo!=#KJ7$cy@mOE6b778z zX))hkcd&hWM7!Bgwe!DM(^vm0NAnF&!3|YxR8I23DV2qLR~jTYvJIii*onq0uGn8> zo5d>Kjq@kI-r+1M3_#9wK;^PM2HKY3Ai(`WxP)6m)wJoC+s;p&%-r-EEd|D-A?a>P z+mUCXSP+m0a$kVCw&_0$B-8oJGV~<4o>pj?U{I%yv`L;(^_>ln?tp-5MsLdE#TFw1Pntf>}jR~!Z!;opW z7(b6Y_oz3n_oxpzmHtS|rP;;41j2fJ>#@8fOZDSNjr{xZo6(JDL&P3K$_Uw`JO9k0 zb`8b9U{#BVhAE>5qby}I9DdefE^ECEG-#5xsN{9F1}Zi!Qm#VM{v?8RV~zEkiXINi zhv2sqclj#&EiwwIofB-Re*^Ty;${fSr+CnN?Y#nX*It#$0FoF;27xcjPorZ}uh(?8^J$!m9iiZjNN(^#{`RWo{> z+07^TbLO?#DQG1UQdJ+B>qSVMjVi-`C~Si}kvX}seAwbc79ip-xQkKk=+*M%1*|aN zLqMvKj5QpfkGYv%>ssw#T+225)=SG0KRx>HX8GP$=)K{=nT?ThFy`{G7Uy)WM9FAw zqgpUaJ&XTqv24mtCSW#y2Fu!Y2=w%dA~Vh&Dt-8eanr?NE?44~9yFH_Yc|n6$vigk^PRzwjFL5xxJT?YF=i3JcW<<~QMpVN(IjrPp)W_Luh|=&l)f7&-dT^JkZ_ z8KhJELY)(=IAlY1e)j7hDX~yl#-S6VkvW2|{RSq8GlvK7J`NyC`(wDS7o(edcJ}4Y zR}RD4^*6E_fAVXbhQaB@V9>6&n&OGq^I#d{D4f<6DySl|AC))>$`)>*dB}yy68O_LVAt}J{(e-(H$uKSc63mb@IFY}C}WpEQ?mgLF?3Tf3z8@g@&UAP zHxI+Ngi_7}>g|*v*cI&98}ci>rj%0bCEcs_TP?`#ZrCSL9#T^xi#=0_cg|?TM9XU4 z)zgGb+)e^Fwr~|QW38F=#c6L6{ai>xT!xy;SZ;RSm~OOP{DV@?PWA}do11FppR!-2 zZ02S?d$Q)kItgZh0h2xx$TSKb^tbl%Q7?)OA~o+(h5-FtvH_6EiwvQG?wAtpgjDn6 zje&mU-EU^@Np?>{BN79^&Vj!wC6IX34CA@*QUfn;&0Y-7ol_D)!~==^mQ0L;J%9iC zBOHrz>%j;t2uLr@|K!~N_sr59gy#QCX8ErioZ{a&=D+9M|N1#y2i{L@^pO$(qX&}& zfpXw34d6_IhTQ>245*y&>*8le?F zlTKYE)@K~EGD5+n8-w?{NUuRKMkT4>u+`^e8J@R109fT^uVO!~((wgNhezte& z!-^s;JxE6;3yT8erzMe5Xp z&yW=;lRDaAEs(^zdx1lrD_Ek_@+*!5GQYUd#bn;+yZmgJd{-*3fH~Cnhy3j#DnP|L znYC(RvG(DZ-Gr$RcKZ%bwiIc-HikqKU5z$b+-^t#h6QDA%rKRNjNvhXNt)TK(lEYd zfXUAgA+yxFU^&k#r?A2FzDs2aFEIu6*#eezt#Z3p2e%pYNKbAm9Md?IRw!`gK$uj! zdDP1Uc1n0P#=Rw;oR3xJUBLS99GNzoWi8X{d30O7B6nug-$mN{K5M*56Gp;6iQ3&u zws;o-%I+b>uywn2-{NV$ceF3AE>}0jtCzg7EGe1l^Wsb8YLkFmK7SXn-)OV&~ahtjZ?`?d%%Z_O6&pNVJG zwk@XLvo&KaHlRKhM+lLJvu3h8mbWSwCC_O?Vfesjk!yNA$YDZl5NllvtE{O?o_(`x zHbm~4wy8M0`%0p!z=1i*+GN!X4Jt5S{_`7-<>MT0@^n&|g9IwqGN5o4o9aZ=wv0j{ z(Pknhgu+$+w4n|oIgwX4Cu*3Z9OoyEiOB+`BrnR;A2klA2%Fj`H|sVE_$9~`X?zAj zVHhxu`LPkT&Aw=wMO^o4M&DUdxCX9|8?cM;UgY&#oY%9`&2V}s`NuI-NDdy?0^<|N z+S99UBW}XPSG?lVLF_W>s`<-kuJ0QXCFRhrl4QNcO(|`7E8)o!#KL)%rVtcgqiEB(lC-0lll&`dY0_7Aoj>kC|5~bg z*yUpLq&SznGzQFObJlb%OJwrWRo4V%ZNMU%`84mg6(f+D=ubEje$8u79Ki668a?7f zNS{X-5y^`61y;fvbcr}8j;F7gIUmwy2RZe5`q7U5=Mf3-r_@xOs!0$=oiMRzA{8zh zvZ?f04NKT99g9(cvSDM5$js>{tnIR&sRL-$%e|;K)3oO?(!42Pns=fl-iH$dp#>n* zKK5``#xER9j_Erj8Qj+Bf6t!iTEj9(#0g&4-<$cmK_fgm~NC8cnwUT`zFz-D=#s_O}ARr{5(1s>mefN*(z7S#W=mQ12H z-j(SM77*;ZO|WwpqP#GH9~PRXBYJ;Y(6~?NM+YYnFCy7oV{Oi4hb>bk0^G8Td(@G@ zF0iP(!>4;8&b^A-JKW(_IC&f*%OO)C$-u27Key+CBIgTqnHusXJWi2Letly8m zVUA8TJ{^dAD;3$3js!n%tm~71>~Qg*zfd;HGs$7wm*)5bVGFTI7~2Hg9WDJy?-!$C zC!9^%Cp(=*Uc}hruGmzqVaI8f_RnSLZ*>;k{Y&hrP0Q<#$#HK@g4tDx!7*SJp;c07 z+iHcZsno7xQ)xoDC(Nqu6G(Ip=)%Po6mhqIWW#~ny;E2Kma(pM_477Y<)ZN);we{X zU8V?&%Cb{Geob=Lgv>~em&YYH+wtScdi=?i7R=8yT&(jO>kBwIGzA@*jsFxcCAO7w z!Wii$8ieA?bF;Quu6<&hxO&?@N!Ba<3SMQ;cq2d@DH0cJ;qO+&eJQ_VQ@R$XNz;%}jZjsrjSj?z~t#6L(3ZBl4bMx_c^%e0h}=hYjj)Opf#DuT0spJUh(zFeqD#ozgxL z84c8d2Pp_p*!zS?Iih@u()ndEsZZIpuiApQs%!8`^ev0kx8zXb8I`!fT;*F;7fr)ht53<1g}QudorPt9%Bh{K z}AH&kjyTi1tUA)~%{Mg23Jf*c<_8`m|x0bDn-NxT1Kkv$<=cAG& z3;!=;B;|e4HsznfrTb~J9#+c)HeE_liXQwUI3dnkr_#N7`MM>JtAL)Bkr&7ElRv-o z|GJnK<@eSYJ(f?#7mGd``^mN)^^~$^5wr_{+m(V|eMW%Wr9pKb-)w#PY+ij@Y=s>< zJo%93e7nq~WQ{eQsKgN!9<*xSrs8paD@pD3bx6Tt;gzwGKV8IX*pdt`$c#_uN*ML+Cu;T~~PH5fE z81gj_{n)PU$jbIuh=Ugi_Ns~Bp;PpVQR1{714Erk3FAZST8_*EFYWG7(Fl~0 zQQCXzk*5A@qA5#qY;A2gr|Y<4Te7g{tHQbHzjltJ_|fr;abj-Li)(4|T6Q+=3Ta%Q z|K9a`v!44_MAX`q>TijC5A{dwSzm2xp(Tfr%KjVhs`3^6>5lDBiYeqnLm;=Kwuk%5 z@56J!GTtD;fYSb_!}w!v^oyrF=a6RxSgb7oI@Z_U*JYxTY4$9t58&aO2~sQEF?Iww zkET^v*LKXoh1ht#Oh(#v1N0&?Ns$ zEi8ta+2@+%L^4p0SU?qCruwH`QL0~PPTIZzAP zzH#lAMLPU4$OARyDrfm})fF0?`1rQDKqw?%5$(6~8OAh)m|XN0|DoJsaEGntY`Cs3 z#PmS82?Rch2GRF118s?>6Q`D?$UH1dwFho`;lgp@?PkW#3OLs$BME5o?$iCe0rjLD zLB1SBMHgyqfXkQ6d1rzr!uNp`Tp0Hq9yL6X(3QJPsg1+D{8O*M)a|@qIac@GYAtR8 z^V3cf@zd+tR*w+xD|P} zddS`wPFG8LcN%=R>TbaE9p`W5+}_$BYCw%S*w48ND)Q5#g1ZbYc60U?r;82sql1FKPJcvy=3u*oH4B$l5>}q7l0FbExm(woI`l8&;T|PHoz^it~ zIYiDQ-)v`Q1sV?9Nv#i_iC&*?*xzkxj9Jvh6^?WL(@d=g$4@TlTfY$4{I=2dx6m|S zO`d`4vn%Y+5;dB7mw--nt4H>8fm5(>vaor}wknGc>Gj9Egu?9eCx7deaJ-)Hv4sIr zXyxgGZsTO;19<)?-UyQdpoa#5pQQ0>TCe5x(1im& z@L1O9)wOD4ik!~dk);j956Nk|>fS5vB`tYGvXA^RacmU2$z(6%Asl-VAv?djV{5f0 z2P|s?|7aB&X?86a#zCw|%GXigMYn&aO(QwCUZ(1A6J%=%c{KLttqWWayb=10O<`uK zje0cy&jZ<1aMS4h=Db3x6S{-VW^J667*i>ontrX?UaZG>2xJZ;vpYFAXU#&V(MfuB2^ zU`YkS)zoz%#+f+%^Eh=C%!8FLJpUJFv-pqLHS4(DYqYU7mG(FW%Ze6^A9UJmx}!5j zHQ9sxqcdiAV3DPbBz8Ow5rAjaF7|Ji&10Zsu5{((_dxOmqKn1D5{E zz=}s2#fM|$hwB6IH}^Xd@L_$ZT3qam@d?HNa4(b_{P4n>o9XY(k8n8dx0*k2ohrUx zz=aR!sy)?;d;-XS6Q0!i=22*+Xw#3*(+@Y>f!kW*X+v)uOnvHUELwlWCerMEi{)Kg zRtQj1y90f6GGQ^)*_?nbiA)jxAsfR3O$f&C^gnoe#~@4FEzdh`J1cG5wr$(CZQIUD zR#w`!ZQHi})_J=7jT7BH&-9s?n1~&*@7N!&d+FM1{nkHz!YcT4&>P2|;$}f0u#S_E z4fS4%9}cvYpIA z+Rz)E%I4mf30&C>%K;k#FK>#zbU&7pPEo$vgYzg3-+QM4e8qO*k-pR@uHiTM->uTE zlT`YHr<##CT*=u&UG7BV-69W`g_~dwu?RSj4>EUqphNEtd+PnWd9=~G3|jCz@ra z8KcwmqlW{zE3sc14L)?3dEwYKXs35~9R*(Cg>9+!xyJ2N13&0?wZ>j-clHCqQ~~(3 zhwwmo0o~n0Cel zkCXh56RMGD-EO>h@*?`^s1B$iZ}JfZ_iKra9l3Yg9J^3nh$D3kjjH0uMMwIrQL*fZ z?h+hv%lOGlumf(|4?nKWy%}$?g1ae?^?>t$KAQUQ@VS2n;(@*@QCLS8eQNcZ0n-(M zVo=;45*>bNLgZ=nRs-mQc%$xOQN76S4EC&}e!V61?ciY^7Ev76PF{Gs0=CEdWa$jh znrf|(h|f12DKZzaFPT|$VbBM?doCEI6qM& z1ijx8;7{jYxWL?W=M0qx00(!|?)|6{m{)y~F)}_}9}-7yH;Oi%2^)gY$#XKcE#q=P zZ$*jn!EDdg>8&zWJ4}6bp}s%1=4ywl4}2LE3*|F|uQN;7RWKDf!F=)ok`_mk#-vIJB34Wqodx-}=&uK)GI5QZkR^Eu zf&D}&G=9R+cv9!*{T;pxoCoa9x$6K2H{-FlC(%RGLl6>&P~~7BPm2SEr}RKJ1XW%V zH(t5M>eX2_6sZ$L;;44CWw762pYwX&Jh5%ZzEw}jvs z=@Y%H2t)9o_2f$i4_plK86gisPUCj|1W6#A#1?o+ zpQ&R*6KZ~+4)zF%eGSfu@9Yan;OYxL^$dV9^O zgYPz2g1-jygu<=BI}&!#y%9p|610I3u$G5#lFvpSi0W>Pkb?v0G9eTS!_8)0kuM?p ztZ=+(F>~#sf~J9a?F#TaGzg~Eg6ZUww}0Qfqr8#{AIec4C`I1PN8UA~eEEoc;T7D; zq1@#~-jqh(O_NHJVwVK*c8?5YQNSQ~wS?=%9Uae4rrf}R>j7;1x?w_nEe>w%V(m&V zK-)F&c_rSVLBWQUv%euZ_=d_;IH)G^jtgo|taP?`d3WhWDW@vN>e8UFw@HcB+77C} z*KLa19KH&3vbq3VX#5rXtb-j2UmLbcbfNHs;g!t;cqO5HnQJIle?40Z8RnPz3DA2k zcERyv^n~pGaDM^n{Z6<(?Hii8`n)1_aop3bPq%+f)mj;V-1nBKw-To(@<=h}P1&z^ zH~xN0b^3$94BjAMTk>Ve_XF3vEBZ=M^1U6!H;#SsQZtqR;H%*bLaNkR2cDT4AK~ z&nX5!KOM^f>dA0~lYd|)R6ibv$(Of;+VTf)UrcX{?O!_gXHegxCV}o^3i~QfbPM~K zfTK=9_^C`t&Aw>rEA0vu*t^$tFrN!Mb`oL|edsdS{aN#7eo0CsJgg3d$z$RR)h?yb zskM6@%FI_DURn!p2jDw3sIY@Y5la5CPW-LN;D=e*8gb_t!k3R>af7071i%(x2lj-x z#p%Bd(2?YA5LscD+m|Q&G6v|)bwksmy_+WE@MM(dJ^4xX(K{s5r@8Qy3g`{LwiVg* zEQ>hthLNDg9@+}~?WawgCr_-0H2Np4^`Ll+ediM9W(370t`dkv=n5TtgWWJH2icZJ zC)sZ!@j|(jTmw|gznJ!wrrf0LT;q!oY-smQ19c@uYC`!1tgMCzHznWTkLW00BaB9& zjM7L>b7}L!ebLqx_wkWZdPR-c$lBPjp^9mHQ{CW>9hZ)Mkrx{zsWg&6K%zhJw-IamZ=x!wrN+pc#bxCMU_d%}f-I|#a%zQBL? z$1%hsdZ!u!W)778jCh!rLPfUwx#wTXED#WvA@5C;GL{nw1q|FHklsVrr;P7l*{tOmie z>TgEuqYY%-Q*+ql(le7~fKVsWENC(sf6#DRormj7a%zAPnM>?bG!nNUwix(B2sakz zY8`5oXYC-(u(QXxoe(6yFtf>A0SlmxNCb1{w_PUkh~*ebTAZ;IWpS|E9$2O>#4q#D z4?&h7vf|vFPdBsHL}ipMh7Ffdfu~9bQQAtO8707>b;z=l-eKF|f-iGwBX@OxPJtfH zQ7~#%YtvnaIR3%1jNSOU;v6AgM7mg#7S{Q(G=TDG$rhzIG53_q!29#Fe_kxG} z2HLD=9f^G)L;T4af|$9kmw|lqFE;ZdLqtKIQyLF`i)7i+wCa9WtO}+_oZHqrNC;DP zF7AvPW;~Cwse_!ON+RbS7E%JK%milL^%g5-Nt3cc;s#64uJlf7CdFVWla7MfC(T58 zvni7PWss$esN||M=*r2_ z=Jp4Z`C0&E9{vXlWHGB#?XJA`xY*d>39z`g%;|yRU_smP^c(E-i9JN5x00gidTv{E zM1i;}c5Yv&^*@=~TZ*K7$$+mpCWYYH_WcX#*;QG5K>f(sTKp;*CZru7CovX$+n3iG zv$b=M1I_`W*Ko=U?!Wgrxv+<=?av{HBxAhlMp$H`WLi&V-a64XWoSHwDy0>zH@+RU zXxkgUj#(>9^;sGv5b4pcsyeJ^4)9pVw`nz1{Q&>rE?#MY2bq7=R%F2c&RxU-=>Mgz z>VI{Ye{P&o|IZqy|K3E6QJS{f5JqXrxw2)FNqP{QBc_=|;CCDtQUxU^Cl@3LZ2CbO zVnQMssTyVUN9^We4R>8CCD&66G6ER?3uYh(m~5vnfJ+e`Lep1`N13M~t*f>(;*!-; zjB48V+UvgankUZA(ppv_`MHYuM6~|%_VB3qNo;cHurliMXo%~&n+hcduo5CACk(dV z(H-3F^ z{pq;*U0A|j`tQ1>IQKZ<+;U8vMVSzLk8?Ha`Bg*?fjZR1WJAb>-f?8WjNGdb+Nfez z=Mv-)tvo+AJXsltWznjBYa?*0K-}pL^d4E5re52j+|r+)|>G?BA`xZa*-?N&_s`aXkylnO`tnJe7}(-zSLyju_V4U*{@VGyR;E- zlIfHm`W3S#J#K(Mg?2kIT{%(#C|UqGu>lL!7m2#o(WPRIfX{!ikB zvHibEOS(8)SUb`EN3hV-)B9_BUC+kA*38;OkAeQLG|T%hMT>u)y!f|g6Zu}-K6;qW zdsMViRYL_gZ4%f0rrL2^^SZgEkZ|TQY`2>3JSBemOO*G{(NzHgRO*IJkz~l-~@IQN3?E zXh$08HBLc{wBbzwq_G0)Y-z@&>PsuC8_knJmOs|Ce-T1b4JQLZx;pCdGB(okME)?F z&v||l+qa4%Pgn;o$k0O$#5}rBvM@s6iCo!{VOgnp4yHT06XD3ubXgF>_|6hK| z|C}7)|MTm1k=K!1r$=$=Gn-Uv?q#*eGJQ0Fnitn4wGmtgP8tfO1ym;7MMnu4P!ZfD zcEz5(8_@El@Cz`@MpG$96ifBKbgG(uY-Kw23ZB`uSmwF;h$6b~_PcV4ll^+#>do8l z2GUTT7sq%A+8RM7Tp}{)X;q=$dKV3Ce^*a`n2#IFP|7N(2`%FskL(V){Xi zcG}*WTh9*$T#`;*qi$K_rKDf`VO{V;s7`KfL$;8AOh0%~Qb?gc3R7aPL)kM|rH!Zb zgi&QoIji}{!U87SQKpMdA)cQ7q$EqNPU)qovbyyQozrrsG!kxf`T}wirg5{?y}T+%;bgeU$pHaP(o2d3D~e(z%Gc z0Mizw-@)jzV+%5*@2;oO?hMnc}(6aq}+E&%C|-G>K(PTG$n2R z04j!F9jAv|SPql^fTYwtgw(x^6(^Rcn*Ii`O9sHK2GH`G>#p6IDJu@suxUS1-d8I& zz=?8sRU?{HKL5yhfJ3mMQf?LeF`J3MRc@04Ao*L<`4>PMj=zEf!GE@v|Hl7kdM*3u zVE|^lx&GK7JI?9WDt!>yxT1TTRmpTcFKU z)tVW+R+&E=N?09x*)wMeJd+%*ZE=^??41d)+3maP;}(bjyyGIh<>!pmzvfz~L%;cy z;dsBhFceWS)PIG^J9WkjtFj4OlwR%~((H!xpUEoYjp9#ai3 zL!_)XsN_^ekDFWlZd@F-HoM4{-mf^-?qfS;UaaEhzw!2}ivJK=AQK2c>>D*g$@O{( zp62Bn;JuD|yL<9Jt|$7(Y5)1F&$aK*X)pde@$=t@Mri<$zqRlG%(eVS>a(%7|1Tg5 z`(FkQ0Pvsra~t?Y$+Cri6HqRPsC{A=i0TF1SowT|0lQ$2OpZGI2Y^1zUm5Il@O3qv zliq{&T!M)*GarjEcOZ<*&t-&ot13?O zh-`>%q#Q3Xye>fDi}?5`vJ%RNI#b-z*`(386$}gp9)ISRi{`+$!p9z*clt?eSvrhIg`nXBET{2t6} zyp@h}PKQjU!qhMm4Y6P|UtT?>jL$Odki?}b$u~!nsw1Fagxkc!VO|;O$K>1}0A2kr z06ooL?%x3P@9Yn}C3ywUEj(PQJG3G4{~thK*xw`138a;;I4`>Z`^hmL5m#VxM*k!sCAZ;y)FA11&bM(O;jhz*%e$!S5P> zG^mPee}0=#K85?#e|%err%6+ja;yG_@j=!D-~EF>FaCeVpZ~-7{@K_6FYxDXIVG#a zU!&dkTrT46q_r{ucS;b7uN2Dj5{3F@L@Eh~?qrXwP0RJTO6~Z{4!4lO{2TEt_WbrI zI0#5U4*Tj3wBY=Ld!g}TfLj-wQ&%8sDS6L6_nqAy*Q?Deoahn4w7RPV=#j#!!9 z{2vOLG4YVF-%a*Lt@h=v=bWYSb- zNH>V>B5ac|xkb|Y*&f7q(;baHEOJ?1KxBd`fr&6~iG3u?hO3)((H>nVFPvFBTBR=5 za;P<*cXM?@aiwQj23NQE_7XM)Va4)kNO=K~GLEoq*1tikeriuORmnVw=kqUDOU z5?-*41!ip8vg(xyNFx8yP~l`zLJWuaDFOw_}1vs4kj0NJen8@RS)DAR??O+Ttj(>yZp*-zfTYukAvNU(Ehg020Jh_aY8 zcG=5vyFrw9nS~mh<;05BI!n1RoA9J9WKeZRJ1H_3dms^y@0wR{*hZ8pNe~h66--9~ z&&CC!PB|{-ltq^Tik12>!(RZpH&UEFaDxJO=pP{-GJB-b8<5-qCHEiGI~v?!^X|BG zJ0cyyX}3_KFUfh-LERS)Nf#ockLGdF<~)wH>2^}(nFn#?t?&mtonr3s-g1fMKRnPn zhWL3e_lNoMz+W|YyCFHhiAUFew8AOu^M4WElKpsvdH@;uZlu$%Zc?nf*18_I}ENHg)53Xxv`FYKKu z-Z$7A%!n4$AHn7BcXzY{pW-fflrN#d??PVOr9;(+5uAwcCx;(5&5|A0C|_QK-{28` zPuEQFFI58;Io$Anq?7ZIs!xn@{($Iy4?Xl^h6awzXtKOjH@E8S?u=-%z6@x#v@s!R zhdJu_ukDG}=Lcx*u@Wo^qLi7pqryYT2Ww?XIg1K z%Lpx3bhMiMF3_T|yZNX@x%sLBK3HWC0p$!)wyDrGxZ#J_tW1G&E^C`j^w*ULi2HW5 zQ5CP(ZTdh~W`+WXM==KsRW&7!=+c>A6ERdax3HEpD&FNXZ9xeaNPddz9hMasedIMk zP$@=PL@5FLH6%_D(^L@!As-?#V+A2A592=mFnPk_O_|jd2&fmi0h(KhCGODd2<|*Q zR%b`iW`v^m3@EgxiZgM^Dt4-U@r%_q4h=8Rnytg)b5Sn^HE%yd2j|O8)e{?={(;#KLaD*$c z(UEFVW|mb)fJke6paiguoo?%G-_Lm7p9(@NPd-VLQfo6Kw1l^KOZ^+b&b-!7#%aOW z#USS%Zg8LF-r2OCm&7LiP{+(ie{u{@TW{4rZ2xd{|MJu*?=y+|0%bg!`zx#Cpt$^k z`^CrS6yy}UJvwTkBA>usJ>P~(gmrJ4=Lp+jZ<CkSgo<7MB$`0|JA_&CjOCWHlqD{71mL@+_~hV^X+`~6y~ z>N<3#fCir~g^3ZmX4TeMS6Ox-OA8uea4t5oVQGkP4)W{>lAjvKSUWa)reA1Ls&_^U z0|M!ix_>IAms_Gom-Ci3;CFwB}-gHFftB)tb!|M*Ss?E5xC_1hb zB_H%g-MmPtyVl2W3)qFj&RzEGeRg)G*M+0@$sVwkr~NM1ec+6FxUEYI(ThE?5`9Zr zdg?hqE|CF|Tk~M_4RZ?J^9-EZf_I@WN_!1(;0AmD{@;)4k7mp=jQq zL{2Rdbgz!)Wp^6u`OdZxNI0jWmo2f5J*u|}DrvUf_}pNW{fzj6?RgP`aM|zxh6~74 zGe>On@R8$CoF*01=&?Oa-KAFz7^cpe&G0ER5pBXb0*uxH zm!m8aaAPhu%wBgba<}u2BlZS~@079_{CH}&)XC0WumvGPVGnSe7#+l=9Ss=z-Jh%6_EuMOhS$!6 zgKx${Z(ynwk$y`i<25L1MX1`S5H#}fR}REUR{kbzL_(_k9Z8siW^VEGvX!a6{dww& z(^k#Fb=v#b`+37_n&X+F6g?hQMn=X<6rN&zc%hKU=zXEzC`=UYLS?w=dZl~aG7=#; ztHN|HNRQE1k(s8{=_%T@lrXW;-x+jzb@-m6s(1Y_pwGY%ytq>iH&>@@fT=}5FF;V7B3CUt6c<0FGv zQ811uXWjb7i{d}xfK)cQsz@5x>W}bJOGtG&`|9nkmvECmDLBl=n7IU$C^oZ`WzNQ0 z1GDH_6f~F;L4}+sV#~`h8ClABIIxl`;Ogji5-Ma3(3;ni;8+(#u8wfwM%p60r)oOd z=cHAgY&tQL#I(g+88vgq+K9*|n4cm!6;>BEw3j5TvEw`g5T#Bv7NJ8sxMJa)llp1(yJ;mC^CL9OWig<6L0L4z~Xj}_6-|MNR2ASz9P6lH=T;B#@)F0 ze2c5nt&+Vs@bUfG56QRDGRoAJ1({hjudw8fcZzT_Ux#^wA^CT#R1poRpXqoE^++2Mk~>!RgH8^ha8Q8v%E`k392q7 z=&@m&E6dbrUO8teaa0hkRT?HO0tnib)y{P4kq}$RhJ<4*qkfvx!`gZIgkIJitq?AV zP3RNAxKYeBTEl}>NXFxe75hwbiPF&v_FX*EGL!+Ul7tqej=i@vFd>o5y!CT|CeZ~n zVtHnQ9(I0KX(81GMg@G{Ml{RiV1HrCBN{?ZNvYH{(a>I7!gbjmJD)kk^{_;F8f(#k z1;%lzwBx9TTW&oaz|ncyXrGyhwe(U6Td{ z$dcXK)!5O*2$wY|u`zTcJ2GP^o8D34gD-?~&~RcLV^mXW>E3cdMMI`XGDOptx5kXT z{uuGW3`c`(2oW6&hLJRBklE;$t7bSEEiHVW8Lf zfpI8lX<(6AtT3j>T=gN#l%y)3h7uX%q@b%HEPK-^mcy^5q@15k8s@9Ett7N;g?DQ^ z2JuKRJq`L8PliD?xen60<6XtSW#sOX6H!UnwAY}hP>%Q|8?f=&LaA%hx&rVFBLaTj zO8VRL4C@XD%Zy?RFp57dDLh2BB9Qg=BpVT53`t;fX?L(el}Gik#?|b$`5Oc|3l%lP z;S5cYIyyl>d_<*zn`@RbC4h`i(m%4VZR3N)rR5?kXjEo`Q*^YNI%}t7ojBso6S|TV zm#hl0#wExL>szGvsM--1#;lA1($fv`bLej>D&0^SAwv4XLfAf!pIiM%t;m94F1Rf( zEyrTUA84Gy!uRtJD_|7m_fwXINukK77rQiD#u*5Ppb8r(Ow(m)lM4?;_sgXl+FP1~9U@4#YD!ZQ8 z(kXdB=TWkN)l6bxjKsmMe+@+wiKTYI;!$c7mvJuMwyRNg-*R&+6E;nCijPKnjy~Pe zbA-_rueD27<6cRz5(#wBCYYS%P~1v=gSi&PLeSwJO91`~-;HI@T7K{B-jSrL50)jQ zict`;QuCxi{^z`4h^^m#W}!-=Muyy#+9Eu}ALXgGnG)pkQFED$NPDi~v!fckQ@F&R z@wSmTaeE8dv6q{CZAS0Dk2~pYX5ZvnhS=N;bNy%w2$DpkP2EG>Ep({IE5-W z2V+Abg3TZL*gz=k=VRyIS4>Z0dwL~bK++Yo)SBujJpPI%^TDB`rMD=H5#ePFo4>dU ziqAT8&RMjl+ruo!jsw5=tPMO>2bGMQAL&7Oy1&Zw?9*_f;`BmFArji+oEj!@+)z@I zJCms~co{AOIjt_-bZ6*Fv$l#iIzO=Pr3f=rp4x?+$u-bYL(2z*oRaiatsBC+(tBkw z@ilWAZIcUsk!MT)L0YHDH2g7~Z+d_v^R&-+DVJ%yxoxj-*VaRK7z2sSi#3!dN^8eI z3}hK-ol#zEFY9ryIhtj>`ACZmU7$@?O;uH5nR+L6U-`VJR%d?rRU(VKk5YUtYA8aM ze2~bZQD3Jlx%Zv;iCHJTvXz1HrW=q(t;22)qHzKXXA+n<$v!q5Yy}q^=yPcQn2DsA zNT>6)LmXPj_+_*kjf*Mh3gYJQ1s1Fmk+JgAV4Cyjh|sBu_LGc+O3L=L`)a!-i!F(n zD8%@%L)fU+P@K?-&BT>jLzF)<*CpL0oZ^{prS&$~0KbIu*4WWE%Ac znLTrS9wE`s`*2JF{j9N1!$C?;gIlu>3jE!2@vI=WE;VFF2dw9SNc*+|pIFWvO%h&@ z<3^kNavQ(EFAFS)`6xgfXN1+^m2Q+LQ{)8ea8YPm#_+Z;!cEWDf(3l;=UrG<#UOMy zhPV%4r8jdl4{0Nd$$s;0$S;K;^oynfT3QZtrm0BL8(;9Xp)bFnqZ+5ZNxKLD(d#TiXvQB;X-cQOv1L<`|oUfIz^w^JqyXD`>IDlkj%s{UHJDOO81_Q zWBGH!0&I%z_>LOa#OH$}?!j$g`H-2COHy0tUrM@Glk^~&27nFxRMf#DH5hC8IK=8e zI5UtsGcnszKfyhJ!lw!#8)?Al(P`)@Z0Y28bmtd+6c-nH&t;a?+3FnB>#Bx5I;sOw z8K7zds`aVZvs8d#F7;?y8{udJFZa3F^9bkTE%k$i_W=y(Be3=%SO;S1Gi^XzLPKJ?+$Y*1(JIzyU05>&>chf5Nc?6xt(P1q<0@ z3?Z~a$L7tG3NI(qyzQiMO54wJB@m3c(jXn zfQRiGeQ?!>V?{0ve#xiD2XU+G2LaQf=>IUyhp4yTDCGbgxl=JQsjq8m1u>Hx`#p#~ ziW!j zY#N`K2W2o8fmhP#wz=>*wTTU63@FpC3$mS3({&QWy6_ z2wfDx+X#JZZV?|^=^Gp6)WeYKp>?YyvLnFKTdU`z;|g5}eRQr4Q{AIIc+Zq}MDCb@ z-3E7QoswpH60O*Wxwa1Jp6w#uph*wxWV%`2;4AnJ%u+I*#U|k8Gc>HI{wtzeV$=38MzanFTfv=YQ)Jfq$>1E zJ=TCupcUl$!=M+*{yA5>+`i)exVt~=ft+K*auM_IxgQb%I{SpSjpebE6CFtey}US1 z+i4%{mC5k9#FVpr+ez{adWAzq2YESeHB`pHC{cOBw8bBIDD`t+e|W| z#`Y)2&LMPTc66k9_o=EyU%L=;;dfb+{AMaTg6byv=!5<2G#VL}JsVNp|5~L@A*C#u z3*&EhT^*MNGOlmMfE7$w#QA9>k#LYJgZ94N99i@dPrhzLC4Thho}p5K-c1g+eL1C0{Z7SOl5v^g$J#bII@9OsOkQ!~}7A%&|Q3zSLQ=b@IuA*M_Cmh7|DR z35XHm9Pv7!`S_M#FgFeJYZwcYNU;>Q7b62{`6n-?IF(hSe_XO8wVxqIuKqy^uaH<<1L&dm~=`R<1`-L5|vCgXU^3mm?waH=IVNM z7kc3rB?TX3CA9-7&1H@3afYxL3h*0+1A}r55m9x^xii$*6O9N@Aku3uZHCFmnc1v3 z1Ms(ywh$l1Y4TWy7W$1V>HEp++b&rTwc)W(#L-p6iOG&nBNuDPR=HnNtbaC;Jxk@u zoagz**|)5j0CD39`X;L9^pwq24_8Q@=hh*MqT;Jm2p>Z?Gp5(GU%4$EC!dc%9wpU=TZ4o2cUBja)GsvI8!_HO03p;mna4znOW!`9wnNE)bY#CO zm2B_#u&xIeQHxc@y0Tg&_-st*Qfh10U46hN0Vn(H9o^B#)WgEG8WN${FfdN#d4kkT zQWMIK=HzD=?fV_vvjoInF&v1=5+c&3T6R)r14@`+@2N38M#(k7JD`!X^-U%*PD*u0 zaf@Sh_nLl5u)A0_$N2=H|h&UYx}nPp1!h<2anvIT3sJFPQa6)-snn*jw#def%sy z_%Of2)A@!ZK$~^jLa=6fC497}LSSztK_XmMC7`Klg=55x&s3hoe6xU>ZhecmE<+wU zWI}pq26WF7z184e)odz*MRs$3EZOkfWWs#K30OrC9||CuKN5_QA@K#&lB8fg5_)j& zbqI!GIehej4F%xAkiFrxRb257a4o;ZsIvIY9tD3VyprtS3SnUDbtS~Oho2uiw0u&! zFz~p4*Qqch{fN`(w=z^y6X7%yf}d7MqhCj5zDYzoEF3?@x2;cWv1mpZ(9)HS+NF3V z0SaO5L!nk0b+yTsl|YBvvt!R`BD%=<6|ov?Vzr@7#I;w6U*SXEM^G+a=P1(w!UIlK zq=D&aj|V0__+jWC2FN$-MIN{viQn!u?+7D!lsmjab6w=NG zh!18jXP&$Jdr#I7`UjUFm6%GeLa|F*AjjB4Z2GBy>d@zm@{ceL6BX|9Uq)#7!Yir+ zazM6PSbV8m(Wy<-fU-~SsP;JFexq;A0t2gU!%) zC^Sxgb@eR9CAg3~WXIRc1sg$oIPc2#C26p;@*~5Q;^;K=UIL>_tun~3GDrA|FTfuC z8A@08|0zD2#_T~VlA+45ge9(>`cA#s81+_?$*-U*^wpITau!MU+~~=Ra*k;egJAk-t^=^b^#I{?dC4{>(s}WdxlzgtJBX7zJ8DQqW^Q< z@BZv-{T)7U1pMV@J&x@rpw#`Y`khVKneOLd-1b+1GQnf;3Uk!S&(Y&2;5l=R@Ru~( zAqFQ#6Nqklg0C|{&FCIGM#2PEd%7YV`!$$Pr_##g+2$DH8)1k&hK8lhaG{ee(wi8s ztRAap*6C??4Y}s?faZ`}cu$?&%~yEzLlJ_MtAfu%6wEbCmvDy}Ng+TQ*4J{1DVV2J z6ykI}6Ym;WG~RhW15jNzENYORNm6xl+v$PX7SAI#c{r+I*bl%?FwctsaAZfWD5aeu zp+@>x3?Q4=AF1Fgcy+OSxZ^%;ojm4thdlrU5PE=e-Q>%v9ppAK50j}k8KqFE+XuKpOLdawenC(vZPUFm1j1Wv_$E^~&?^89 zGKodvQsri=g+_59(2)n2MPjHyX4uX&2wSe`XH|nuX|J~Eo834Gfs5pe2*eA+;{t%) z1V-nEEXU-AY+IayOt0SjR03JnMkW&tZ+p<0n5oD32ARXGonqVSJCB6X$&&LeKX2&s zJGFUT%QWZOnE}Xw26pbt+^QNVz>kuLW|b2t6M0Bdu&gx>K(h!))kmP_Bv^oKxY10P zbbsrY;G#dw?Wbr4R!+eDrRtL>oGEwXl2`6AxQvhg;L8aT%=;*Pa+>?|+{tB*<);@G z*bIl@^&>|9Qmv+|B~416OO5sSxGGgLR`hLiDuHP#jZc(ZU!FTZDFGLD*x9aoprzcO zH43GAXfjt3A$CyI#^>sZ@7WRvx((xSMEkT{FtF_x^c#IIVeL#PUb!BV>zPn~b0 zE!eFS0_9afH^fqtEgfqTLJ;}vk`r}pMezc5FKgv=#r|xlaR;Y&!QJQWvNo8v8J}~; zf)r#;`owbAIJ_0<0?S5PQ>2JMPYu&ay)y%@6#-qwhUFm}BZc>FvESX&I$7Tn0m5JG z#WF~sg(>g_Qh+u)cm8+k(W)2`eYff&Y;}s3FE3F!b2uq@5eS{J9DTxQ*Y(%-h)z=Z zn-p>KyXh*)aA4TOT1W)Ugd-beH9eVJ%z$Q~IaaS9-dk0q!+i!#-h(vLY5t#KEg7=H z@%&(oT?37e95PN(;1eL2E62LLbeqe3KC~xRNd*ha7wg6Z+o;YcK_^PgOpjuke3sXp zvR>t{Oj3%Lz=scBV+dOrY`vfL^^X36Lx3!iT=qp!nn|^CdA?ww!*5>}A_ns&i^Fx) zzmE*@-p!Pa_IdgSEtPQF3xlwa{O2 z#!fq6H6Jq;`c6CeOdocBZ+N|z{BGkC;M3z>@ACUDmCfOFIa?@e%RX2Pdp=vVlCZ(a z)5BA5?(o&nck$W0OOXP8yhpE4w|=@i&-cpsBj45K{bI$K=@Y;ol@M7J{lwo>ouTU! z-#@E2XKqEiI059tw>zwAq|`{4A?Z)P0Ph+e(M93p(}+{%E@o*%j|f?1$ApGCxtOU@ zgbrMwBi`D-PjvF4ayn4ogMG<1*>1(#d~xDVzG757l?_w0qtimt ziujN_m2Ggnw;^S?;!0dh!#inpm}L%Eh4_brhR|8L92)h=gXX1G6tNPl1}U4N`sV|0 zhJgV{rb+q<(z3H&%yrAuRGoRv=C3Cg*SAa~$hS!0P1`1OQ$L?y`WRqY4@pRhJp6n` z;K#`tcgQSG`CZ-kme1yLefT~_=6dWHY}vgc1r$G~^nEH8q?E+S1AA59mxc{(F!~bp zwdVXc5H{(?Kr;y^Cq?_hOQ^SvBfdqE;2(**@^~c?;7bfI6XL0q^G@(HJ|8U=Oz2G- z29Uy8VL$}$v}v4I>eg5u?bWi1^?z|M@UMuI67`y=GW0v=;V zb*D}UtSz(G;6}8%b2}B7Pe}Bl8PmWU9Wg!orN{)I*jG6j4yH{N{j1_izf%~YxFuFz zoh)z`t^c~I2m`k`4Kk5~D^Hmyx|JYske72^lZ#M4>N7vXh!~j~lg*Xjh}Wt_u6iO- zxi8@dIiJPR%7yFCKc5QM!PV5(+5oVtdehXCun53~?9wFthEepGV#h2vJiG#?!Qlvf zVvCn0#T7bPVnawjhmlfp84Ob~VgurOFx}`^oYJ&o`ik-HM3E`O#fjUuMBGaV*GU)? zf%Q~l_NCdS11&rDdMQ%rnbITrpW_L2N*fi$8NQ!4xs~CrGD5UW+CIjk0~d!Gqdd&t zQ-!9oV~7bEC`O>^_Z1mQ^(>}|Fd$5EnHs}u`GH&t~xrT1K7(7`J>`9(m&q)kHe zu0QhgH-VG*@B}T+pJ(dDc#c$pMNhpCZtxHR;x)$Q?8_yyA~p+Gj3Lv0$%o<*w9DkK zWATW5Vxj}75ZLzAo56xEw2A`q#(YpzA@AjrM#l|V1y_VR@H>o5$(cGdS6~R1H_IBH z-qhB)Dr&nFlUwx-IaaG9ZVN1{*rMz}TM6QnzM4x$z+!CHqyD;O0%PC?4g(z1Ov@v0 zA6Z%sO_F%4NDVoHb(gA8MwF?55`D^(Jcx3%lX9mrb4H|`0O7Jbp^>G?V{tQj&}-LH z4+GnMbAk9HeqSBeWBFQf$_f;%Hp~(l0MIBWDsy;Jt;^Jhg-!g_gX)5EM2ervz$*2t zV&S5{YZXN3T*}Rx@oOm)!6vm!;-*nqIWG8xsnZy3m#l^M?8{h3cj-oIaE*V_>Jj94 z-@W1la(6SD#j-e=_|}i!$NySS@=l`=Rj-H?g;lUJKz&0TUtypi zK%aXHjUm%soOfuFLDpT_jBZd-kGkqhJ8QN$1CR=!(k3!itmd})O;OCk!Qoc$EUPIp zf10HS9gb8X#=y>j`nK3`XA=s*b%p^q(IgYoxk)DPI$R%U_;+#w|B>$X7w6#T{6svK z-;}*K$53I0%-oYa9_yX6O^ah~OEnfcvlLbAg9|Jwkm?m`~RVaO~ut)q)F2XAA!ybMF|WS+u3=rfu71rEON)wr$%+rES}` ztxDV0mu6+&+WVa7?tAX--M1t9$Njfr#fla2y>ra*jTmdp=T-X1zK9m0Yd{vm^0IG% z0sreC+a#NJB1oBt*XFuBaJUfYJ6*cX{dfOdr+!Zi>28LbiEk&VQqN_k@&au3BALN&3$|9S%OI#< zoVvS-A;5}x6?06AgX@hUK<7@DYeeL2nB%g@Ib!ovQ2mV4SBxP??r~Xx%>F`3=WBNM zw@+1lwcTAITk|3zqps<1!V`n&OF7DU7Uld5N(~MhIWpMgWV76I#wk(LO41#1F>4OR zEn6(5v)m&BpDwpzUznYmb$F4FC4h-1s&%MMA=}Y#1)B=7jQoPM>AstEC!aK4ibVAG zkxGSwyV}p^4gl+Uub3N9svyZO4(E1Hed;O@y0|3=;*l0u??i8yWjYF;O(7HNTbbQV zVpP<5rl=H;i*$?7}tFR%`kDw1{WnAkNHRHZgooOdBf7Y2?G-suY^oisA z(wqYq^eGaVDRdZmbWxn1(776=sCcS$GT4#^On&#vdd86zXQ&^~2@!+YQR#2#h=|O*nE6BtT{!kU&DO0hPZN^id<^X zSC}}Cbum1p)9}9$_wC-C%e>bxFQTTm<<&zhPZ)d+)Kd&~Gc8VLl<1`eZWe3(qP3?| zHJ0gm2%fOVsd{4#hxj2l8C4}q%yuqz4$V3(sY<^wPqR)pi_^>K`$p{ofOi>ebyu=i zSXGqZzr8C=W@o$IB@Of3D{qpA?Up{x)k<75OP5gFG5TAv<>Qz4g(BPLR8hOi8+phML2DGl z1-&)bSK}r06z5j?P`*IBVnETYk5W9JHh=k|=f-xw@r-938NvBo_buK4@khD$K^S)C zn}l!YZ&oXtWNz8xo;Z)`o{Op?cN(ZMfsQ^C286GxooJUH$A#&!5=@UN?@q4qSCVjS zs9wtAO`b~c7-JEL7U87ly@rJ6IJfRyyZGXuxPAFf_alw0cBzTV*dyg^MA$lSY93%? zrM$$}C&{lW21-9FjWeG<^-lSQLKR=xWu2|#{6nKVdQH7TbtQjC{UR(|zPOp%#QBd! z?(Yn>7X=TYQx+wI1w!nkHbaA_gHYhE7Bl{;x*3Kq{|4D0E9R??>a?}K>FwU7QOR*H z`;YG04mo)x>eryh)I#&+6=|7|UDdV4*FtUSlP*Xez4i~Ui4Cwu=R(&XH`I*1S2si* z4~0F@|!TT8JGr_vTnTpbRLF0;W&wXn|c5;+}TU5jPF= zyBr`88M}J}>0}DL3j?VV@L8KD_|BG*EzW6kD7Ci?Lr6MpV=o83BlGHmD-YTm1!x8F zqjx|D=)(BN|Msh+ze~pyXuW65t;2j#7TNVjvomQ3gN0NtI&LA z1K&%Y(0+mpPRH%7zd8(R+wz8=*aYwA8n1v4h-Fx3H65`CkF**mN8k< zqjeU_44EPEg8}gFHKBds4Q|@V_;oqw+pMF)d?)|@!f$vW4i@aS*JdX?f*K^mxcd$T zfH=ht&QW~gdJ{7iLlcs@=PJF*mHc@NHj&@rl>Bjm@XLYNF`8;xtk$YNXOCuGg*{fa z;oJs-C;2ZF?+Q(I<`>?s0ev;!3}(?ajD!z+){xcOmJGoMnQiaH3NxrOP(e%ZkbR@; zRXMA^)I{*FsTMc{*b5SNci~J%(5OwQEvI~06!$HIfiqiCTcQgGg%^~lCKDXTAj`z| zp2WmDn@64)(DGFzq2qDld^z%{V4Ajt5seDLDe^ev&KL!HF3|%u1Y{mbcx0YkGRG|F z8Z*S=H)OQqLh8-Pje#542i1JNR4@S)@NZcaVnx^dUgV040#CPnn(0&RXNGQ^*i-~` zoF4va>!z&mn(H6zdGrRb>m;q|^oG*w%&pn@vsl^#oZ1ss>&Vz8MFo$x9{V~b3{<|} z8n3o)1YJxst3bX#$B%olDO@;jfE4^qZ;4CNdy&jN0$>FRz?CR{3c_!}?118Ex~bWp;UG27j!7F5 z@MVAcwF@%f1K%qneiN9Gnw}va#Gt$druqM^ihspN9yJj)a90=tZAFv39FJF9nG*Q? zLG03cqaXgjBa6s$|3%*$wQM@9F8qm~Oz6BgelQMO=I5T}9 zGf+z-UF;XTmZrA2F3tu2k-X>YDO4B+Rkwl6+Tbm4c*PMOsf$CK@Xq0$%;AUVz6AO` zQ-Teib=JmgAzfIvStFQqBif}wjtwbKs;yDhy5p5cE4lHR?2kv%-n_Il;t&#rHsk8{ z0?cp$BM!yHH6Sazf+@NQwMmfjKs5AP@r=#CNy-U|R>j}tIK&g@?~m{$QXr~L$n@lP1kF9obpeZs@|Ck^fv z0@|oQ|E2@N{T+fSRSNPUlnH13RH)ug+ibpNN`p#y6Uv5~^sA(G>haXFhDA-BMPCS> zq?}M{fvlWhY5`2mr+?Dq{=t$kgTJOOL1CV=HGt`Ek4HxF6rq7r`i$BTT*(bl1Q8cp~y)zyr#k z1{m>u)Ae2K27PV08+2gE0Q!9y$f1xQ&`p@`JMs;&9_zxHK{W11;;bK$y^6?JLZAoF zHx_hti#fg^y5jA@GA`>vhcdA&O2Ov?I=u_mC`%?!e6Q=hj1TG5C8;NIWX|r%JANs4 z4^eU~OY+8S z{X`3`BlF1^i&{oYj1$3)qzNy00(9YnZ^Am9(Qa2Z{?&bp&2eYm__)uRj zlss$Q(tspb{WoPEZ}o zxgn3TNZv3K{IYn{o`DiR!++oF4&FYU=mX_RR3!r-#XhZFy!lNFnI}AXCQZE5Gp@S- z;s_B!`_%W{r!HQo9*w0QDAE1u1_jChj8vbrFyA=)Y0=g2Cm?%+P6MhV$3(Or8l$>U zPGOP+LPxT`uiF+sFNqiu%{q8Np%Y|i=y{;>*3$CA?HEd_h_;r(-2?i-+DnC<7CvDz z^fZVO9Ww?AYXL1VeNt+D;sx<)nULuGWE}R2XA!@7D*@1hRW^k7puM%i&u_Ufo`1R( zh&}GRq`CsuO_wVl0zTp_4mZ|~3o-fUYrt_vPQO2rtMIb{ik;vGDA zlengh_KXnOV_j)5?~CHvC&@>o=#7>WFLh-M^HDr}qq=rV_Dn7u4?r5H1rkWgzAusa zLbTj4A~dZ7BVdE)JlSU?MyM^M%B6tIS0i4HG)WwH)N-JHS%)|cK?N|~OkOO)sn-A|+DRe#kAty6z(Q4MmGpgvk4Sug(uEasdv z$U*BjMKxK-{qx4 zj6lpJ_@bVo{9W+}`E==v>Vq_wz}Vl&-z>g~ z(jmw{k#FR=v9G>to#jgN8P7Ynr(bVc!@mDr{>_KcKIGKxx7bV!psagjN*;7a41EXg zPU%45moMzAhYATtunm!pem`n|+q{{~>l4TqDWJxsOYHR##E%7Fi`LHqZkjd+#JHRb2OvbsJ#Ufv=DB;z2E6I%uo621`^&zPF!o`;+I7-o zl0W=``ktB62k#BP0f82irE`!WPQBpglalMwJzZR(IuWPeWS@wz(o+OtKAV9p;o4nwOABz~T@b-h0}6yuvp z7h^8<1D3j*Nqc3LN&EShx+!$8GjyC5hF;9S*jAh@Pj&oM)M*dTJFsV1ZVJ9N zB55bq(qaMu8HxU@&b}-V&i|LrzJm+n|031=tAqMX|I6(b<3DNg*Tgfy4*oz2b@vw& z*9AFHb8uRgvm=qn)Z3gtswGp8`rauP8`wVgxV_=uY1%0+wn`2?^f0_#h%(;TZO`E& zsLW9UN{Xb&H;@6ks3w?Owmqr+Xef6TQk_gdBd&v9RF`6n!+Tn{NcRP92iv~lV;zl) zj--d1Hr`p4@tB(fZ#<^K0@}BL1nQBKEgs5bvYaBzh*KOorNO%38@wxSBT-M2f_Y^G z!2jc%jfx}2dBtDE0pI_IO8me3;i?0n{LiZQA3v5L{2x00|Ixox1_{cYA~_< zbJ7ay|M=Da{!K{r7n3|F6I|%a7fh8h50YX-4j3t_i%}H~t-IsK8Qw=SXXWclaX8YC zbuYg!lfFpb8bECUQ%{Li*R7j?4G!E&tC%ShydR_uI)d zqoXlJc_&$nz;%_*d4#HGht37)M`BCey#7+RzXzS%WtS zP-r!J;Lr)|KVrRD@YQ0UjVt(GL{tT+Rf1PiyQJ@d`>OwyZP976~wM~j{%2qd{CBkeH_`vY zMa%F1JHIE@uB`tV{Cv%@O(_JGwkDDkT)W`$_SD42#Rg9N{HHJqV&D>37K+VCY#>dZ z%Tq$_6gbdQLbV=;QMaj&WB%v}ng%Ws90}IPSvV^%M>M#kTr#&(#Nc(cx)eU;&l&2k z{k>BS`!^)0=mU8#XP)PHg}OG4 zp=}nAm2-L^l5;F<0?gZgYz_Ww1+KHdi^TsgDN1TUX#b;&^dGkd(*I+*{w@Bq{w@Ax zI5b^VZ3cw>kJw?D_H2%V99fG*9w`oYw!1Utj?aWS9rk=qiIz}-K4Tti6y{wtJ{SHv zs21tdK%4f$=G)hM+(TGGsNJbK~L%i$(e>bBC%aI$HVYLP}t)x4M>X8amV}YI(C(%Q=5CrhmA9kh;R9tqNTqY&*_p0KbJ@NjQ_g$Rcf+FYU zso%Beb`23-x0Siy{J~if!^{|xQ@y;P>S^Isvrjgc#&K@t(ef<(mZz(*BIz45tWo^} zCDd{T>K488NKYlwz)T$8is(!?C-f%;cwk-(`iZ!8fs2<`{@Hz;&gl$3tYp+g7)r4I z<`agWmp`H(Up<&HOK=*OjrE~a2+x^$H1jwaiPW=Arw zwRJsJDKF+?b$EdZZ^j7YkB@mKZ58R&C1%akgfuYEkH7CaS~}9nWYP6&7!VLkkkk7U zowVcRx1};i-W6Km5aj7bBwbF?wYK)%R9C5 zF@D%i#<6v&4c9l8&(lArS=fceMG60=479%|r2k<@|NjoBQvWZCmj8Be|Hr)XpVu#; z$#eF&VrXO6EsLy4yN-Tb0%dm6t7Ly2RPKwAiu0AI7A=bmmXK9VxORT_#9lvDk1Zjf zIX%RRfC~#t>LBCM5EGNNFT!RceG4)YRT6L#3z2&qx?XKV3#bv?`kX%ObaULs_So02 zD^R(dZ&2vYoz&{j_GWtXb$PyB&~{wCORMW)5GMg6ME<}H#|#@g;PDu9v_I9I5*;)k z&2fEN@~|{VkA%v4pl8RytasTGX39BE$vg}aN}h3nOXPeq3eXcQjIVj!LX8}5ff;+8 zgkU(%+8TMnX#=>S>TmU%jvbV+qDW}ykAX(|VLW)+A8q?&NZ+jd;>01UxCtH(Nd19e z76W!c;R7&<#@kG>(iMIcVm~R$(plMt8ODX7a}S1ZYPauLUowtu<|!O=y7&#tJ{cCY zEMycz|C)-oI;*Oy*Kh5R*i4?K8aK?T4U=0BUt(ODT9V?45(&+YGY%J%Kf?6foEo2I z&&4?Pl(=qD-TG16Y|WAAF_N_DMqu@0Le6UTSuWnVD~vX7SUm^kh;xKFlb&(;)n7uy zD3dr3lWw|R`JH-$;4P?mcT(DpJ!`_H0E}3+KG$^aas}{Id}^fKm}T$1BfUCRvo1>V zch(`WW6BzxVV`}jVQC*m@Y;IBCuLVMXMNC`#za1N&Sx*`HBnp9R>UYUhew5a?TPN_ zj{py2^AJwp(dN<#h8mBD2EF zW?WYmbz0@Ql`>x1LC8;G@LP{In~Yi2>p{E7qU%oGMkhD1)T>OrHB$^~sU`fV$^2OodP>q;tR#M z;pbyO$o)Ki9&Mm~5S&neTtdIPJ;z{vNCT+R;5dHx2SY4>i_eB#PgW2BTd*FagTO{% zMFgUrlEZF32Pr)_2!uV=p9-NqHkAggrJFNG1Ad4@+Y$kmv(q1h>gMyWU76p#zh8Ly zfDda=z5_=EmOcfP-ccF*u+A7$z6SCI27FLP-EqDZ&-38ld8W$@J~tNn`h9RlMPmOx zS5Rhd@L6(<83)mU4F4{{(@A(R7o?~3E-ybOloto_!c%qUocZlpLg;at0qU!G?h(=p zsDG8YSb@O*Wx@0Bnd^TOWo;~-UHu#6S`JC$5$(jb9OA?6OSWvpTl zbB~F`d!>PBsdSA|G#4Nu!XV-pH?%YyGU+TO@%lVE@7Xh)hr#Vt$vD zHGqOI#9z>{D;lIl1m`#jP@TK2=bkR!l4?_Af;EEth+Kk!jEn0c3r5gSa-+v;*%+zZ ziy7M8?m$|0a!!p+q#bdbnCtkmVW?#eNt)Q;lQlj(ZAYN%-ok7XNYX9B>qu!B8#9MK zm@nDEkpU+n&t9cHXV9Jdn-<=Cg{eJ~V+;}QeojYR>w`AceujEuxC<5aTh$88TFQqWMU-rlkYat#AQ1P3na1@)T)hx0pJ?tm@ zg_id3si*FJ639L8IP>T+9>z=xj;lQIK_((xcGzr*M2Rl)=`Z;Z*OO?Zbs<@SZK#K% z2=GQuVm&E>U`%XE$f5$VG}z;P(0mYx&3reTeJyr`86J;24;VG74h(1!7_s`bcWj9y ziTCtukWrKD6wIc`a8>)1tPfkx`Xb|uGegDQ)H_*Yb>0_ukfY!gR%V6RD^xEvBJ~0d z6Rx;zA8wivCKB?kF>7=lr}IS+f_jO)MKR8qHMu;?Cw12st%paOlXET|D!qVXUk|Yj zNpu^qTxobLl@yGDVK(8Lo^Op78N2-EHy1y{D7sF2NU2hiIKJf0SUApYViHXfa9hYw zxnSOD_9i6xQgu(+5R;(4sRz#c@;I^~(g8R2x?|d(uil%&chEN^ZDR7w@+#c*E;ktY z3B(6`{@?Mu)E6xk)<-YrohN|0cLm|Z%qedwsYDc~F}v1gGFugFgGkI8xXHo#kk++O zK~N_c>*eSiEI<_s1w!S057!f8WAvoqfhnhs8 z0_(uC4W3z{!Xzbm((h$J9==M^Bvc!P@Dw`c$&UL*_tybLLJ5A*9_&`ftyIAJbp#-m z*Vfql6g((i5i>ca&ShQZEXv9o@H5rxC`2v`fF-DZ|E+*VqS>{$xap8Wu7 z?UXEuoryIbXAfOXg3HJ@_%fx^IIy%o&g|Q?$NmxeQP*$pOkkV_zGWg={Qe$OAe;z= z*gdMiSdCG9@|pG*NQHerziz7c@{+gBz5Y&DfP#E+1`m>@y`a5%HOeEX!4J`c9>8mJ zI4Skdx)~a!6dq2qB*OPScD6&Iz$+v+P>EX7#qs2~uNBW@YHCt3TcRgpDOpVfFr|7n zCF!-;3^&-alk*dON;1HyWa#H*6IdV^;4=QY@+P1D$_=ELm<$xkxUz8L z{Yk~=dDQB@>{BPrT=!av2+s}H$iGE0X;Y}9E6AjKNEh~I_U_=zUCq@FX9D~hImW_O zrzohGA(}A{+Oa`av6uy14VuCb6^&PGbPp~-B-N9pcVa{oAA}X zCBAP%W#zUPUh1oUds%8`eMVsaB^5EVW!6)+{oCV2LbE$VpVYi)7E2k}_ap~tovr$$FAG< zCca%JtM2+nbF~fo$KLdDb`#p@=cFXUqsinc&ilrCzvOMAz6=Rx@Io~}qkS=s@Qa8h z(_?>N;YZR|Gf3~;BSQNks>U9I0-++YwLHq(W47Aw;lqjxV=@Am+?%y4M;C!Z=i11 z;U?Qe*HTWspUeWTkID*}Ix_IrL`zE=AFf!r5RND8$3)y1-iPNWcAeN z833tWFhI$TWVJuBdGnYpYfqnBWe@xN%!)Hm&c;{QXQZc=?C7cSBCNbfJ9|?dq3c1a z@SCwz@u%ys1!>4#EeCg?dsgDmXj>~jtO^&D1PHdMTRC)j{9YG} zVRhZt9HQUg;a>(Bv3kdAs!)l-6;e_nO|ZWOfsJBBskZ1`n6`Oc;C|9?k?G!9+cVSF z+M@^=Eaz>yJ)?HH=~hofy~TqA$ZFt3I9973@%m;yf%E%wITSlSX%$K?rS^H{ron!z zzCK$zuxQcoYg+{b_Znt?U}m+p&sQt(R-E_uJm{0gy@m=?Qvrc$Cq|9^;Uob zKg!Y*Eigvgo$)4Kl!%P8Zl(`GRLzHv~N()Ei$f0b+De$xlPu-qi6J0q(Pyq{UKJr zJ7)Yxi*1wsRoWC52uPpiU)A#b|3zQ_Kda^cW3%DE)xXctf%H*PT{$f|B}d{e5D?B1 zM3DrcN(hLc^5|eylpvjzOH4BvG@-bi0Rtg1B3;q#>UwT`R$Z;_>g;^3wN}5n(Nb)v z(d~1->3W#tgZ9}Sn+u%&{&UN9+Uoq5(>7A0x&Pbm&--<1%PTIgekWSEaQsISVNA;)?;NVc}A|rlXf| z$!kc`#jArw-2jiba?%xBb_oTg%2^8;ibL_927T6C;eogPUnXo6U6(QFIp-S8$gv#7 zNp8y8%Q!3vQXAHReY_chUP7F>XUDFcs#v*XxD;Af7U3C{KTz&WP!&RFR4ZC7%GMRs zo7CD|m>eWyTk>&8Q<+gFntwqjMh&{&H?Wfa-dG2B+AFJcVJ3qpsa)3~v}P8PU`DnC zt&7Ud0Lx@Dx80Q_-Ws*caV6%IsD z#cDa8zXJxw=NGB6QFd9jR;A5K4sq2-t#{6cP5<#a{~)xF-1CeFDc%MVKIOhmKXz2g zSuaB5C+YE1yj#QL$LVa)eJ{_{#94%!+u&;;REH@3KCaPutE9CybBf#m5s89bu=I31c!E@wlJT`=+u&3OrIr|QPX;WPv`Ho=}Z9fe$* zIJlr;zFjQB%S&LrEf6kh?W5t00TP_NI^FWgRpvVqgZeJ};5j~S?&hUKS5YQ#vY4u7 z?4?NCXvfqJ`=YMffj^Hm`Yh+g$}7MI=|>U$y5X$FZu3|*pE)ae*343j+2YleMXe5| z^c11FOR2d_iSgYM+(KiebCGEXn?;p2>Y#B+lN9S1x3FT-ti!WUha%T5kUU6Lv&=hz zrCBpf#(ZF;-6orr$f<+{4>d2{8vDZXLI+bL#HPI4CgXY2pJV{Q;3LjrBhFPKH9w$Y z-%&|WVizOi2nRq`y-?#+XS&;2mXIp#V%_QBz4m+kN$SuP8xroCb}%^jTDjhF{$|nv zm^VEwD3?s@R9kfiZ|_lb{62VwiIn$uU*rW`pMTg0=b|qI2CSzZz8-O2T1v__p|*Vx zpOZl8W}#&fmnApj|@_YkaBInr>Z(_&rqvVkmqr7=5vCm=6D8o zLn@KZ6|@PBoieCqg`M4l7Ui=Viai)+X7a1V?xM<<%;MNjPxaQW*0nm*{L2*zAiPk` z)v)oi7IPYx<#w^9n=-hi4vcNmz_^A^CmmyaUlqW`JA69Z)OEtq{n*XJ2X{zcI)>At z9IU&16TBn7Y~|Gu(wOZ@sluClz0O95fj#c+GD=#Bt;o@;SQTiTphF?s)*B1W*n@II zDEem%T{{w{dHvYT$YEf1GvY@F}8Ulb-NRPasavKQ#@U-t!0Jbx*$ctD|>#s0t@1f(LIt{=yfUAToLc~A9 zF<(}w#3{X_%@aAeIaiL4o#5%9<1cI@90G8Rm^6T;ho=3V%$^O<@r33XshO9t<4Z)C zEGq7d*xSdkmEiVUs)HRB zmFZ*aU2t`jVBHKcvu}%;a^eTW^`A8-&FIROCY($EN@D&2wpgQjqrx$!r6sc&!Uvj4 zsjUUavw?Rh1+7_+jVr6sFo6+cG))n+6-#zu$7FO)Go-Nyk?Z2>k->ALram1ut{4+U z3c>?Nso6-oL+3^$>h8FPV1W3m$Z@N_9tS>QP*R{+8!}9~csxZB&g!>8s9lZYg49dA z9X?t%E-5Ehr>lcOQ|5M#-1K3+F*JZp4swA58$NcyMOhncZUJWh$#7<6(29@DgByi> zAMnLbKJ`arC(Ys1Bxpa-HHLJL8)}=Im3NU)&?^{HYQPDQr1;8s2xLH)C5tP5UB5@e z3Noe8h6D1&V2tyF)_0NMQWmg3@MQgpQEyiRe|wI)iF^%VkCG-0iS7|sr@k%`5^egh zY_ux;LdtL?cYnJjLykJYx=;4lVCX`7VMg<6UO)t6JWNskVqBbr5k6r@Myn zXz1Y={V61#m@$!;K4Gl;z=Dwxhr>x`B73n#&d)OA47RPK-1-HT$q;8sI|^YVqscpi z0ed4>A)h7zU-;ie ztd#VtHSM_H7J--!4+mptGofk>n*ei>h9YQJj&Op>Mg z^0jmJBmH)juS=)pgjddvjZ&?9Ea*L#naPCN*cA^S;g^cHh*4_HI%jY%Xkxg{K`sPE zwT9nz7|!X3ubjA)WXCzej^lct?9^~U)z@Q@6YOlE&|ocO_9}+k727&Nn{Hzx6#mWw zG_ga#p!Ke4%FLAZXR8N3gt3r^7-wRylIlX}BFmYxho^l&)``OhXD7I9)XjzJ;}=9f;FFOe%*gQ{(|-bOO%m!tmS6+$EO$*nU?>+STZ zsgi1I?N|tUOb5im6{zWvjc?M83%oVgiMbRD{h zZAs(i@d{2|&)MeB&2bKOkG5d0E&B*jvTf9;Vl~!Nlc-jt(T4_Dr)w+EDYRmZcu%Km zTzM2s2@-9le1Whiwap!taqmC~OZfVU3V_*2Ka5(TSoTMCYv68Z4Z+5mQ=XBS#<{ulm7` zWw;ewVAVNeMQ&Bl6CRCKE%2l+Kgy>d_8pw43ob&99279(AUUD%#7Uz}3IS@ z&VTZ(MAg>BLv<@*$doSEhL&PNPRWr0dWUnQ!bxF8dd5X8(>en&5crYZGAL4^a$E{n2wGk?R1ePgGOTBoawgTo3yDX=pc+1Qv!u!e}KV*P;i^2 zZ(>xZQ)UuPcTK{h28HUW9xVr+k2|=t;s3asb)7!9v^0o;~x%mxn#Tv;WRA4t>e;ny@X(tu|B`<{Mlyb z;#?4Urgt*!M57V+nYE?Nk7Ipd%Xr%IDl~l%Erj^%{3ZV{k>3rsZ6^qj50~nsSYc-D{s^5(99}- z7OG=wbGv?R&Q%=j`!3xb%qc403fYIvLv>4w?tTmVhlopy-sfS_s??3H-B0fNp^I(8 zpIOrY=-gWbMV+!p%1+m|u60w^)q~*-f7qjlbCY87jiaUT5&6QixDVE3MIekXzC8yD zoJFe(ILG3CB$rVKLJEK+xVt{IdBwGgLBIW0(UI_C)n$LD=!SS5O?5X%cbfkSZkK2> zjWaO|2Ig1}6RELo{WvtOY}?nq*?t_t*@5rA?>ib!=(GSC5v5#?W?ZaRA$9q-0h54p zJ*aHkjr&Unt)yJ+YX^+q=iqyTvxm0kaLFoQBga~wR>BhFX zDNx!|_w`Ujm3hGqvv<8C85?5e0*tzNgqd7!j99U@H-whx^`_{~l`bcown zwy*kmdf2yN2&Ky)-TBI4;KNV$puVyp8BSSK5GN8W<4l4C6r3Q+n%!q~nHr5dUJ$AjqycTbKIyk2GOI(yhHcC;kPSE5$| z+I+b-V>srM@9gzKZCxXU^LkpMx^ErWD3u4yJNSO~mDFt2*CSpNIsl}uqYk3n_@I~m zAUm70W)WcVkV>_4-a`yq?DloE`XCql7nlZ^K~_21$R+WP9Mvx&?S-F_ETi3+j(YR9GfoS(rXM&5>u zh0|k<)Zm24P%cEb%N_opQdO|#;8B(nnw7;PUiqd1D5(*NMX+(TeRQ>_1?GG@?i~P= za5Vfp#b((S#S&?6wiPEPmc_m_cEe%J77c@Y7l4i_RW6>dkq1?kX5?`D9U-%cA6RJ$ zfDvoscSdx)YC^IZ2TpXS$b*cl(A~}m*~`MVwL;CIgve&YV@<0w^f~r&GWxYo_hb8=8>#za_Y7c1 z%yQp*cfSuV>CTaQbjt{ zP$+X*OojF?I3DwgFwtna6AayjEm3A@6-%y6Ehv72s{@WdAtw|E&x_uy4X1$pN(~`M z_Kn@GKzlXv_xVaZFweUl0ZGN00gmm$Q)$A^FPBl>Ha{3VxGY`TA3knZfZ%0pg*HC~ z)~lIzJ*4K>w0_lXzaMgeIW$pn8N_JE)%~x=f3PTcSoS)fsxA@u()LS}XKi6e)B8GH zi}VuZ`kDr~o44gJSLa;ezF_fQzDCoTK#kC~MGlzT1Ory6w~ zD6)58(5y|1?92<6glbg)7IDoq+q0t*MLrXK^)S1Ik>QgC$p|muZU|1F6P6qvcpOjz z-LlPt2j;TNGEkU5IF_z;Y}^d=XV^2`m_rwulQ71aqaFwf;6neDpsRWiz!0A4MmC%5 zG&Vlm{T%HXRYJz9WIo?Yi3O;!?8>z{MX=yb?ZoO;VNk#fTFk1O1`Au-aY3 zL~_#Rnw;V&e%!;tGzwyctTg7;gdCitVD@LwKj0-?8l?-%QY82`;$X_$!@hF!&z)uD zI{_A5E%2+s0fQX~i@S9TQ3=?@khgcj3^F@X9^?5jN|lzl(||0|Bx#`f=2jO&c->~O z!U2|kofmS!W^e-AFutt35q!)pl23b@lWp7pBF@a)@rhmSOZK;{G&WK40PLPlN)uyY8iL z9Ub~kb=&1%aOk~ z)Yvufjcb-{8Y?KA(AR8J;a|S|jvJIzCc#(NUu_&CcFg|P6B^zK;o#@=IqKNoz3~lM z7R(B0R%3L~1MNX72;t0Pwl7iPv=12#nL}h)PsimgYon;ZWP>sdvlR z?Hk9$`GJr5qWLW9Bc<;+5^dp)!k;CKpl~dvrO_{kJdhjnS-BVXl-Kq2_l9Z3 zE$vNKVnhoF&b}bj=ybb8i7SJ9!#C2G<`iL&aH^nL^yU$5D;Oh<d5@ z>%;gK(O|Zna`ZgZr-64_EM=bdCk)8;;hJ@w-(O{QQ~MBfIr- z{}$-y7=QJ5Vdg^wc#jDfA)Zs`al~b-086T0vjycS@C)$_QY7DqIIlS{?u6GKMG$S z?CoPaxW@wHxwrfA$B%$$UT}!4{>e2__DESX227B&_@!5m znsD38eGaQ@AxHn^4bbP^Qk0ut{mxhVe4ma$H!9ffv?RGHA?mL$T8RE2Sd3CfuFsB$ z{wM+QDHM4XA#;&2IZ{c;nh1xOx$rS%0Zcqo_!)jTM^}fii|u5Xb!B zexUnEAU^nc;t-c|vYKTNTERJ>WHmBEMrvHv9r$GPK&K$#b@7sHsse)8JlJ_>Al<6w z&J>tl*@7)0YImCCuJXb@(+X!m9NBfv9Xik-*nIpDR=!PQ-%{u^&wz_2)!#u^`R`&O z4JuL8a|f_ZUazn~_+_k}s!DQ`2bdtoV);JQ1q16o!fuHE(D{XUgER^AK{mZO8jPT< z0+dwVk;QnqGx0!^w1QlM1$0xyMU&{0PL&oV!V^=r>d$8pTSP?+tGcVIHV|3R2qgik zO*m`cEjAcgGbiTIRmR>8p49|+<36nc*E1N6zH20{jM{Jl*JID-(rZd?0WNg; ze^)sq%G|0OVcH*k)yu9c;Q99}Fi;PKLRU!oXd3V%x8NleEdz00b;$2%GW4Yig-&YI zBH?vWblX>WjkkTgWp!XibDi2*Fdul{_+++EGTxGueQfgn3__KEnJqpw6_$o1}SE zoLz+ZO`sm~f)~~=e!*LyM|RU55z`*Z0zy_ju&M{$0Ei>xOUM)C6$9wM)D^3M9nf-$ zcny7N%_eeI%4k9m{oS#iR7|{MP%_h9I)@0p&s{;yDg_c1sc_++3X_E7E)p32SYY3f z`B{8tzybU~XULOYGQ#m@cc;MbNcm&bmp`FZO&+-FxA{TNIIKk7_zlrdl86}#tAG2D zSi_mdCe3H8e;Nhwi`%EkQ<&LLYLOIRHohSQ@B^1?3NxBMxC6hVxrc=8IBW0#aVIvi zD{E?#x%jjD6XeeUb>_N#KumW26jpZjfG3y%cv1*(E;C9_?r`mqd%t1=-V_RaL`!^x zmv8f{=g3)k!{rA!fy%1-P4`88p!2@KO+XRys}n&;tQCajXB88FXAkl0->Czj(UEw{ z6jxlt=GDP#H_dFYIqhaso6v2@wMW!~FZqAf7(zA#uM^WvBbbIaK)7*g!@eTZ4f>50 zRx7r@P^?VLtPE;t;zl>PwIYy=ab6lgr<&wU8?j3_uwEKnu0yQMus6!?ea4$)?K`7w z4#t^juQOd~xZ&~S=JdCk>IjU6eiS}^&z=Yjkom`E71r~C`a;cf0Kwno!&#??^iH1a zf;`d-CQ(~ghU~cHe}lM)8ag;|Q;($nN*$scTD{$C5)$U(@`3XCL%^@iM@88C1(df) zeJKMC@0L%v?~GxZBg>{&x#me&!dt4aL!*KSU_=|0qc*{&8{Q)LLWN13kHRAetP>cb zly}b$#y`V+MUy@Q;Q4|1{6WWLGfg=YT@lQ&z^jIgrAbSEaC%)nqr9sJjt@TURQi5ok7kP>(Kqe~E8&~tEW-$M;Lx4*FZB($Ex~z-|k(dIC zGnkowXnlwbcW>|%R2fbl74jOKqJKbpwDc8+(o&-8l2R0;PFY?x+@Yonw|>4Y9Ti=H zWPX;E9k-Uq^uL?jFW=Y9AyFe?9$LU9JyrAp<5+v{n3qu9j=1%KEZm_P?V%bh!^lzP ztq}l>tw^xW($fDg-fS-Yyz&?xWj;3&8%!QQjg7Rw@r&{pPr#TqRep_6H)38NnCm_A z<7xpAC?fqtO=s98vMN+;t4gCGHTLw(*8wJhY9W`;CkBY80aDW(0<5=Kfe%?BPVgY1 zfUs}(>1406GSAxiK9T@I#Roy9B_^~NlH51=U z8LGV&5Nrf_Iy7hYW9=4TS|?A+OTK7pr2(}xy=c%BHo%7=uzKRHqN@oH9BxuaER4HC;m#SM0jzRmyW^H{6aa zy}pl$8ldN<+PSscSNN6Qa1HkArojs0xr7_~E1jv`|MbspAZ+wqn!49@tZwhzxw|2E zq`n7l4qsY)nj#B*Jdt?AeE6mDfAbd{BQp6ic&;R$10LDD!}z0Jy&n0#{D>p^#!UT3 zn2)sHh;V1?!r@tUtcF96*mNw=v_O8JZ!wFD!E2BUIsF}Av=GO5u+N&Dbo-9H#e8J> z6$IVXLg?ULnc2{SC*Z<;^Jz}KX;43xDD=&*d40Mtjsp7?a@q6!RPN8hPF3U5D)r$1X)>*@;?<} zZ@Ow_pi>aE9+E-ju5;krsq$LwIK~(z@YW*KiBio4ll{mM);D?FnFOx7kM&ms)3`50 z{RSuLxG#MDM$6X#UBBTDp>>JoIKqWl?VSJp?k?dG0R#G&FCYxjPD9HioX3mvNSFcp z8~lvUzVJF&2IP#$m^K>_lhWtCcD+ap=3@;2hCA3uFBPeh00GwR`U6IW;W!bl=Nqa<2`kxgLySLr4kFi~yJ&k^Imd%@~ii$RcDXRGv7PU2&C3 z+0Z@(TSovBl%)ZmJ3q|+?I75uSS*OnY*Qq*HKpFZ5br9_*_qmGlOccan?Br(Uz+w@ zSdX&$7R-O@gYK$(984@w1NfILP(_Cm~qxL#5Gu15u^#lGeY_#5C9D$?fkJw3h> zV~ic>R4vk$qx?~zXrK3QON#eF1J?IkXdKMT^1Ie3vdU5+@Bzn+U!Gk6kl!iNDtwBH z`fr_RfjIBbqX^LT9OULvD)JnK^uY;t*rPh;4tEGG^Q@HrCN}w=?slpH8|#{fiG!S) z#DcFZquDPL3E2;@5d+L}DT}-lSW*gk%aqk55W~&T^4arSk_uHijss~Sy{!ARL(%eq z+W_E@@(WLsg$RHr#y(+?fJef8Li>pXyHBtW`qjt_Q^B!(AvST znj&_g4&$&VB)`*Bw)mum4~#-@Ede*7@c`g(c>y(LV|79<+)N)1FKu;q9`FitY#OM{ z^Fs=kHA%5V_IORi4?@Tzmo2!yg7V&)^b=Xg=>7)nB@d-WoOBF=rlO1$Q2h0O$5NQA z)hI400UWL6MXX%Qi#jz&obQQP@Z)KLsgf0;g$kHMNC4BgDeQm*sEI7e(SG%#GjJY) zJSSMYnP*3^YDh~YvkPt+Pn~e(-_pm@**#D*sG52>;vB2yV{2sjPcE&oA@8xS;$!Vj z7^{pLN=r?JBWT@m^);n<2BjtTrBy+*0}+2`L)7>(aAtGsWhmIXBBsL%#;*RH^RBUD zYAI#GkMU@VI7fku1MuqD=J=!3qs&E^V^lKS%K5e>QO#18 zI;gt9AYQ0r5!h^{0VeQ~0g{x*eU7pA?6G#0x*bOAgH53hi6i8CY3Q}etr(P<9rcw*lR9UYY?WH;*o&hR1#QCaD08$-c z8g-0kIT#9SUney|hUWCL1lXe_j4WN&p2oy9BK=HxA9}UYo%i@X)WDuoSQp5rvG0jDz3dS<1kYY$ z(5;EIz!~H=K3-%4XUK3qMlShqsj*%@0WM?% z@6ZOxd;*DL0>=Cs&rT>3_?8}MwQr{Tuc&Bv2P5*k+1zH?B4*iC`PR@fCRXY7@~Jbc zo}F0rj`Tx0{f5W?=;F*>prRvvjBP(sTYql@)YjDs-7w%x!Lr<(g<;!c<1;{VFeI^E5iyDm+maq;H)-0sBcL4YQ9u#2m$4^|#gz`Ik@i-U{ zRxk}YSJ4E?x>35wuId;ZY}4W0E7;$sG;KZ_$e9~Wxq_;FjMY-vG1lidv%IVTHAw4O zGoWi5*)d$jnM~+yKv8Gn^qtW}^X?fcoEdfTTajWTY{(B=kpyK~Km!F^Tfj2-LU7&3 z_aC#dz{RQ&`$C`_tgsLlb{;zT8e3q@ZX&QL{l8UPKm6ARSFpJ-G%QU;jgXk^`=4OIh6Kg zlJzV9q`WnFTz3fqY&Tj4)65iFLs?x7H<4XMgbBj|QMqM%zbhHK3%W{hhl)`}rJ)~S z#ej(kQ1Rm|jzQ>?2(6ElS*6b}B{+8BgG^CJRv9Zq!_yeC0CRy7BBrSp$OjU_9X9;< zQENa0%vK%KK>Ny~Hh`E(KaQk^if@|{6DiNZ!QjhO{zs>*t~3^i_M$@SkDS-wpx|BA z0?va^$Adl^S)WoLmtP;3Ji{6Kwk+~SNqU`wmQixInsAUE{X~U6+U@mq{AEk2U)TVf zvd6rF>$j3-$g*qaZa7nVljX?}!xhM?5|blP3u$Z+QrLgj56RLL+>wL7kS`5W1D=l$ zezr~zTl!QD4e#a{vtDcHw&m9$gTBY6?$%1*O5^2L-2m`%D{fH2&JXc&OKwi^YG*u( zhbq|wMEec)DwZ^1Yf+JH2K%+}axeJP3vc+@x~T_Fd>B85u%*^y$3xDCpH`srMxm|v zs&;Fg1III~K*yt}mpyt$8!T;lFl|5gk%JQMZoa9DaB|N;rZGt$=i>Q;<-ymn$!QrV zY8l8J`#`tDB+n${`9o@^?nF}oT_ZvSWyKg_yBv}#qB+{V1V_C-CJ=QOusQ|mu!gR0?9R#-hm+PfX7 z@R(x-<-*wLDRMmZASg>G$act3C#+)KGN~@0vORESf?fbSPtYV%!|I`I`II+LH&V1v zaVt-GD@oCcgE$3IoPENG=8Ru_=2w!F9Y+tMwq9&4V<-^YS_H|=mtz|aX!9on6AlTo z5Xc?{WG)uN1n2?lNyVt1C}1Z?|G@{iG6-1!+8OhK<07UmHF;HnDz3}YmNG~Nh%>IB zp)lylzU`2H&SjB`29J~^{lbD~y5IhCfNdGePKbBN{hV9F%ICw7`j(KXpckwUYa;zb znKJ6|T%?&;4?9sU>eOUkPdKye5={rF;x}m#J?^*fZ*oEi;(#+i#iiAlSJ;@ByhzXZ z?%DOHc!1JR?)3d>z?nBJe-^oZRU58Cw-wU8bQ~xvHqP#@Bx_0*T@(+dN-(P2Bv6%#`vflc5Q`5AX1ibS60)5iF@z9hX$Q29cSHFb``HcH}`ba(`X2uU14TIjm(H<-e`oiEQ0>k-dCFyHJ7TxAdoQBdi9hVU{T@xkSW9 zE&8$Bwp`5XLpizx+uQB(P4X))TCtV$xP_Xxw028A=5IB-IE3+yC1#n_JW#=oq;ZA_ z=3YPPD?Mcy=fGacNhUu9$e4hYrnhRM?eh@Ic zNTyu%IeSUXB$-;#vd7?9*41h$l}E64Rf9_|z$(!vJjC-^LruAH{ji*IxVtb9YfgUc zSDs}{BNpX^`IO$c`{5k)QARjo89&?dUGR@KAkn)OWd~|~U7m&sU(h}O~kI>@g$&_Wr|7&2%9ub&A4LdoK%+2)o<4X%$SQx$B&X zu0yTC4oObX!qaWiU=LB>Su8^Ph}e*ltF(CBi;<8$Sc#dDjd%(FO3eBd?eYa6e*eR6 z)$J*8B=v!CF%T@7^sCL}}JapKtiocqwlQ~hCFMeYEKszsyeWz~Sc*n(#Tjh=GVSNOvt=-xY z8NJe1-U;SIWvGYu*crXpn+PECY7T z&jx@WvtApWfssbRtXaQNvB6HhURZBMzoJsCPl)7QBv{vQ$v?}5c+_g9Wm(}TU*nIl zTYA7iZ{U25!=2Vu%I>28)ne9n%HVfXw;ZgMg#+Bac}Nq#X@$R=7=ozKK}Rw;=FVoUcf1ZA{`ZFAzWe$uFRyL)JUWtW~S36eHq1VM@3CXUjoeh}d%4 zuqq3FFN1AFzN5J{c<79u@qIo%!RG7nxSsbu!;eo)!oCifEir=kPe0&S?Egn zMi6gEA`B}5ULYq}A-~*Y`{7-T0Y`=Ihd_WD)&BW+FmX@R^t&&NYj#d=g>rp{-Ra-g zyxNA@(B`RsrO$`_gnI44E(TVjAKwvl)ky<2`C{u}#1pz%m$9WA@$b>9c}MkJUzW(G z+|JW$?+nG&3k)@*@+#{7N=hy^m@lvHFqgYUJVhh-GJS{!G zHD@9nLtRzZWhyRwMP|NqZ?^3+FvXzLB>1EBu(|ym>3(t>F09gldUG=E_MsYcNm6ge zmr$XXc)BGrA9ax-Xmk^1QkhTH-2!Al!0SaxR3?Xgm~XM~fXomh^Kk5e$mRh{jLqm> z{zC!ip|72ttHW!%puOpT0#;w;b{Kzdn>|TdbV&})* z6nHM0#vWdH4}%~J685iGmK0B1yX5;=XSfn$efrkMM9NN>E2!OaPH6gQ&_RIzDzcc= zUr5KEoP1#Gn}NX_{`HF6l`B%s8+o?L{-i6Cy?2{4PL~L;dR3M^-`0;2iJQNXHTjj1 z|N72okL7aw7`(;)t5hYRfg)+(l?!}_SGJq}CH%{-FA0DTd?qwMm;Rc8v$cMiXaES5G6 zBy`Tru${=x{V5ARGd;NC;bAP??~X1kY#pbG#^Ur5|20y7U zOz6ZkUl`vXpEipXQNqL9k$huGVG|M?t3{5>YP_rJ-dxFxzwon`NURO4n@5F(9915F zb@i+8Gweo9=UoGBzfNsrcKp$ww42(c=>op>sv9-bF>dD2T)y>xUkn3h!~SCOyGpjV z?~S@P6u+E)3xo|c)iE?7NtY65pRZMLi5gbkmE!nPpNBc$xbP*V5o%`2P=1pO6i*Zz z5}NFKV4=~*FUwV#T3*f2DknZ%;PiU~{d1v6w~{U9g;;eXH|!vkYSJ=wrA%O}$5%dy z1A9SJz^fCYEl*c_`T6Dc#gYC_HmYf;=S`c8_#IwU3!g-T)v`-5jJYU%u^qZOqx?jT z-`>)k*f%WLihPOiQU+hiWkTwoNOWp-8mGIKhncg-?rmu0-{{}fy$H3sO%5M(i(eAF z<%!^X@Hn%%6(MxUj`^vXiEgj#JMI_k<71eCWbp>{Q)Uh`dZZ;|%a;>!LiCrhL&ap? zcLqYj>I~06ytwMH+EQ}jO>5$>XZ@iCala_~$WrGgz?DsII4YY_9t7|VGMRU#gnTO$ zgSvTm{;GnpSFzSF)hdx^#kk=0#l>k)R?XsL2IrVp&sEFBpChw7Cp3ABiCV!TEtS$a zF``DBxY-G!Nl=8D5tPISwdrOrqPMaZ*;XftiLi#BHbre{m9e8vn+8u^!kDdn37RYL zONiC^2w2Fo;Z0Jo{bG3p!1uU~EW!C~Wodlur7Sw$|M<;MIKBXr z<_~IgUlOB>E&%wo#99T7e}rw3we^m^1i|$ZYpdqRgCR-de=pd-U5oizrhi#|sZY?y z${a%`V&$gj3lB{BRZC2%2WU2IUCnzBH?Y;YHVGucOVfBS(uRY{9SMcJ<$t$l}mQ2MR z&yj{ZaUQ>*w=sb{%oeA(UxbA$v(T0vJ}2+Cq?Qxx&Bl1w=Plpubw`t^zX@L7}A-F!S*@73^56B8=ZA`X9CJWZkiTj_2XUH zTF*@MN5`>Sgj1@l?qSHY#?Qpl%^!paX;jb|rZOS?G^|FAb+L#M;=_-ysNyLsXCoM) z;($!B5br=Au{4otG(QPH@1Y}IAadylju6nPb#(q?>&~M^Q;%%v zYI#cQP_h<+Omgx9cbu4rDjMUIqg|$&=&QyGQ8n^!yX4Jmz0ALprv5QDJw;XTy1o&% z+qk18`}qB`WkH_mQF53rzn=`dw-n0rwOFz5HGlu|HcC81o76R>%r>TiV%m_VbtI*iBV+81Yo?N*d;;AT+ToPxHxY=Rq9C?(ayO=` zQuF@fM5+UScY&$uw$)j+9Xd>>&b+1t0lKwFP{(4*vH=pEkhcR$92vdgAHZJbJ!kGIvO!8Q%}F}CYJ>l{lu zAFM8oY;;9~-rZ~>kaS7fq_#>#W95R4Xl*b5 z(sbyY1HrWWA-3#Ia?Y2Xgh$bLBw3$+5STZpg9SwkXeJ{9*#zrG7clCz@#Ua_L57Ep@vs zOOHe*d*BrzGEik=pH;%+7fo*Z&#I!izZy<&)pO{ZR1>lShpM3C(Pnqi+=c1({mQq# zM6Qov471FD?bZ7#Wx3B4y$E>$uXKU3R%vf@CU?ps)BF!**vYp@%2mm*`siAR26j3@ z_9O|f&60xseVHd58kHSd&bT)Js(PyGvYo}td6^sGgN-!5({9Da-GJ!XnwT~S_*&Lo zvCe*&wH(7uy+S62w>IizSNNKE3(-UhECG&YSDwbIib|7 ze(|yaeV`QI3D9NefvRf_ptSyjP;zYY@_iN-TgJV()iD|$CJL%p|3i%R*P;T7uA|!1 zs3Id%SXS6tFUuI5GWnd{3oQUch36k1i;)|IltOjS>1?p6o}s8W-&$OXIYv%Fl82$@ zdNzC6NV}Ld!&}|v+{Ah@v+Xa}2bOar&Jo~=UYc&cAuXOZG1Q^`V&p60X1j_(>u1KG zqq6{ak?C26XR1qZu8^-CY^aDU>*;k1Vdsb@Gd$gneb+@V)!2vFNTX^oN-DmN&7z@t zgxPwLw~?dCBTvV$TuU|$71M8?MMYMBd%a(P))X9<${Y&x9^Mz}VIg<2+B;=5o?ZxTH?d!0-)Yd<1 z8~i!A1o2b4A2z@XCGydMYfF&F29*h`0xpJ18}^uo#BS&t%F$k4t2?g|1U?rpG|d9E z{Cl$b4G#OB6Yu+pc;Lk)#X=yE-@7f%*%3PBn=Of;J3$0GVm*4#MlE`*S++-g2zu z5Fz4n!xG^}SAeDs5wT$D6Jyq&jOR{#`2{H|$g?i3yHJud%!^U&zj`;8&>!+`&Ad4g zp*L^Rs2Z#W2+dHj=d?@F4`Z1<^?p0V{&Vy4aCgj1cXe?8EV{HPD~%U_n)t2=S23Lp zBbmRif^j4)esxC7_Y}xSphw8z)<4yKgzjGwY87Hq|I3z6Am!G4k z51(qm@WsjvKS3>xm}?dzHOWkxhVQ=ap2KiNPnvg)^pmg7d)`s{RYFf4K0|!)ea_5( zp!E#(XEyO|Bh}mm8QfeyK0(t& zyVhuJY^qGuuI-h?KU+$Xldp`E_#e)vyhkY*!I`yrn zcF|v2QwF#Nx)Ju6NIx_&+!I$$_q(^!{35O*_m(N_pKgwfo-rPp|Nh(D$=-Q^)5=vR z#ZjQX;nvxJtP{q-#~c@pY=RTWC!2N;PS^Cnjr64j38Op-9Tc?c*6B)b^aL#j_U*(5;a<04-j3+!9b=<<+rC=#anik158Tm$tgoGSsKt)l61aMTm_k5&1JvR- zfI%nhn>jca&grKh1C4vm?BAt924MdC$96l|eWLI60$HFBxNht>x@+Ye85FXw>geyBd5_;^tKa|pm0!x4$W_;(26Bzy z6}w?YOMQ}v_56SuFiQz)Em6i&z#N>H?)<}9QF=3ShfmPm%o!`0vt4_ppBYV8x#HPr0Evg88V z;)4%*+L^8hX*wgTE&3 z!^iY>Zt5Isp?T37h^_$Topv^4UHj7AVB;^N>~u}f$F%> zKiyCIVsSkj^?_ad;kzgGu6A-xT>vUKe&)WZvi2hckza!$^0j2tLir=){G71+fX`-$ zBAPROO&{Q`tY&!W*)fTDQoU=*zk&$IzMhq)E5xXp5;cnNf{#=Hd2@H}OQOR^FJp z0m}`}#>_@DEqjbiDtW1%CYmL^by^6-Qdt- zeXkUS33U)3;|58oQw7z4ynDQ#7|LJbH43DSd=(7&%H3L$yK>=IuSplBBE9jY$1f=9 znN>#}#EA4gKe+fL$x+x?{>Rjt%DqAS=FXFi`L4dV%kc@}lUcA`v*2I40&=F1zt^_+ zhrJ;*zC0|=yVlt0i4KJ(MyQ(~$M($A+On$Gro%B78H$;X$9W<>7l1_Tt-x zD}v-acNJva@^7J=pq8De50PEmcT%E@hM`964<_tEib#tWkocc_p$(EKeCfB|;hvD= zP>&{>OG?Mgc){<9#{U+;gFGg{B68KQWt^alwK0B?I;L$qjl_R;L|{LA!oxj5^?WUC z&G%1fwht*(LG_qV1}vf_A0h=$=qhs>D z*BR3{$GE3aA}664&vVeWJkkB|kUi)Nye<7y5GL%_sW;7|8RS||AzN1?QWSGIxx8|5 zUc)DtW^R(8I9VRNW?&*{;(gmGSTrww@>7~8^VqE!{|M(;xd3{V+*1I>rLbs|Vs(>D z-4j__BT*IN1XhX1Jz^6aolvR}eq3{ihmA+;w`&8zdheGE+m@9#HhXHyP|#3kCH?2&Sm(lcpm3BUwe2F_dnGv!*?_8VXmksj~MDDPWto*Zm zM?PXApxPtKBz+)8D*3UH!9V4HZ)+UHn?9Q)QG0`&t`)BZ3H8B-vHySr@pjR%b-*&$s zSUiMa>9KcY&#eO!$D_x!z@9ZzEw}>Mr>O0@>}Y(g*on>HrB1Q_H1jI*HnY|fGCHjd zm1B46aH4>GQ6l!>LsY9c#9~C_Vx=0=bKt3?MvXe@J4)92uPq5J@I7xS%}W#y_5RUD_9wsQ0si zhFrS6W7HrnyAXOtGW)6>=e~!XDO9Iv`2;%Y`CiR&I+?=?C zpwrB#w9HbA4^Rqs3yBop?L=+2Df5kp;@>@>j6*rLc zF>5b%Jn+>os-T7T(P)oWkXSliaYv3kbci#V>o1mt2%j9rS5V5dqV<-@#&HWHWOyJG zmHzG#ZaZ=CFXuG*H}YO&+8n{E<9M3KcvSb-=lI?R8jk3xE@|T}EQ|TdAe!!C&F<=j zx46CM0HxdS$V8N9q7twv!;T~#CpE8sG8us7NNQo-C^N+yAsq#4pl0g(3EV?A zdPRP1W{^9fjb51V^x;=fOa(qb9L_l2-slrk((d`C)Bpq3djr5D6Z-z(3wYIIF%Tbx ze4H1_hn@=u%)s(2Mt&hc_e0H??@V6I|F=>FYJxHFR~G&2FszAMb%gKGX!n!aeQ>1U z(+wOm^fa}^TXFc(Ay9_v=b^?7J?#r#-3@bOQ*$fYUU>nI68$nQ!|>2(11QAu4M=v0 zG047uVfXB8J4*M5@XG9|&fw4MDugZXkEQTG+{EVbnwfV>HqHV=L>3A#ox$%({D5l} zTk7>ew+8-mt49Ry-~7WlOt$O7o_BJc(r;kynjVgqphr#s_h1r4w&a1eXF>Hj&xXB~ zv^3?_??&$kzbPW|W}#$3{o~bjimtJ($-8~4+UU8`q{SoUcmL!@Cb5Pw*o$9ezYY*r z=BS0Ter_D>()CdXrJ_>v`=D!<0w^R-J&-^Y4o*R!AQoZUCRyOmLB{HZOiXxp*@pu$ zt3nDpwBmV+6Bi{OQ7b$6n+GC4a**lTO_X1pr4MW5I=>I+0M^<^!EriFU0)o3sp9Pq zB@}AF9)=R1F6t4=)%9)mj(U`FRCn(#cCU?P4~pQ`p?9Cr*bT-eiQo8m4^%E(x329Q zt@s<@hK@s$rVkz7za%1>8g@@Q+4RO`uTOwT>{=VXTZY~zm~4w8>WOZzF!=y{HUC(F z$A^harfr$RQ^>FM*q_92V|W{Km}Wr^3$HevJ~}wEW!-iLQE~ zzju#Vez|ey=ld4iq}}!=+*H3+tL~#pdb0`l!IE_m!X=MUN@rZCe3u_3pu#+r(K8kP z@gFi9>#C@eP8=|>ng0^VBMgT5|L7IP)Xdq$$;#miw8CU&?`B|U^xyM-QUAAhlm8*8 z=~9#Xg-?pob)?~7N?Bi@c_npHS6b0^V6FwjWP%?WdhvHn+Rqnyg-MrMjcKxvs(&Ig zoin~JguzOijynyaHnjBmv`;Fbv%Wbc{s1?ofuVy0WYOp(zzO@gBxGM9oVKyo33M2- zvs)xxP}kX|hH!7%K2j%5nc2X5f0W`_IxYPr!Yh@k*&04ZXY-O)Dz23fF^#jfe769^{9Fg}#pl#+MjuhCS|cUFH?JP?nKqX`Ey9`GkG5naM* zP4hfVj=#>6+*X~7TpaAou?>O|C(*jYY=AJOmKklHK6o0N57wj#o9NhmqWxv{J52to z{IZRNx+BRM*l8QrIWrZ97H!pKO4urMNR)K#2QCV<=eIP8=md>EldYj+n#I79N$$!GrGx{&{UvbQfbKkOMWnZT0o8 z^Pat9RS({N-<#Ho8h7K$=#j7KyE3tva$5KO7$>=S9{kp?7g+2Q#}4UE)B%yp#0EmwTw z5qvtCO-&?T>Yce=!CCgScr)KxTEXoh+~nE!a|OE+Ex`F5l`FC=4njy&S~Fqpo|cY6Gy420}`Zkp7AoyGn!5;=PVw*v~=4Wd+Q;N(ngV_R|wnk1^GA z3aX4Y^10ndk6pg6ZfC0!?REM2y94Pgo|a_J9}5Ex=03*f3n$6xk@!?9sp;_ZDA zGwdL`;oBnH(>8?pe?KS(<76es^}@gR5xcFLYsVe_(9+{{mL83mD<=9f+K&$^r0h_nCeEv7 zR~{{wVJWm3di{TEi4SwmIzX+~*aL%Yf*mjxhpFKZycl)i9( z>%6(SIr*nai7~5jipwS=%FjsaQ|(AAj=qJoQ?n$_2Q-POPi}w`dzL+__&6$?Ayu3; zhdBc!?ib-Nh0-K6H;&YKNFuKzR6Zvmh71w%R z{yx>kIz9&Wj)avfdR_uos&a#W0cXdGhEW<8`K+BQx}rI?;!4@^^yD2d zwMpro3t9@(ORfV+d?=Gh>3S^e1qnXIn)m(A1?-Ls>}PxCBIjjYf#yDTbqSL1 zzmyHgUI3Z4aTc_tQ{`9|rAMQf=BFX)CHC4B8Z2sdVWug@&B`uwldLy+{%pfpuG&d; zv&5%P{uCzYn>w|cEpmpINIkkQ%H(71)Xtou!)REnN&wDpID77fNi)j>BK$KM<98} zGsttd8U1afX|%OAYHP>w?C#<;FN_H2$8VggT1r7hde}*I(U%pj`Yl=5TfCzya`Afy zF2YQ8_bM7MuaBh-Jipy|hBe!OXBldCSFC!?^OQwVCtio8{D-QZTM@k3Sq6%DP-q$> zVCjY##hI{ku4!c%v6F1OdK672zxPJ5b@Sge# zNtA~&tpeu(NL+mm!B%H7)h(?TM6ydKU;yf$qd0jNd&&uJex?6Z-2j)G?hh2wOcL%1 z_BCAw*SGi7JUq#7F$A|JG=L@BNmT9_Cg@R|q9eZgP5jy$!b_LAE&20rk77-#jC;PJ zjG*9N)lxc8#S8`_ZY%=pxH6{P`QQo-@_ZwxQN)T5X;tJDO`n2(>M&V<+j)6Q+>1Fc z{5^9!l45_DjXQw?!hWtqB=XwHF@)&mr`mZ&>U&XCGJ1KGIWFeVA1*HA)Nv1+;WinD zVo^3+&A^jdABo*m!wm-H%f*{uD#`aH4bGeH?^k88 zcF>K67(tbQJ(UWs7#d6~!xc(GTybDZ?H;v)i z9PdfmbnD~H$8XYA8clfTWa*dW)y^(?e`;}RW{gI(n7foWmMO7b|BZ4mHRJo#m9vp~ z(#=BQyRU>-+q5n-Yn8r2mTc-3IP{wKgmS|tSJ+O5YtkK&G|s^Ig9z*7fDGNm{i53> z+9s>GG6-)Sx^0BpAOtr$Itw`(fro4XdAQ;yQ_XGbvKl|8`#c*5`j_rEk$?AW_s+$! zOS=7CpFi15jo!~TLw9NPCApaeGd!${cNefIZ#HJ_);v;l5~V$1HUoQQndC?+fNAlF z!zLuUIKtI)ox4E{aDXD4fl-POMrZ3svkZh53M&4C@Vg&Q6SmTjy(+Nj57JUU6oEGi z$6u-y1mr%f6}a_0Oc>j64$E-DKj?145KoQxNoxBAZ{cM=yxJ*E|0>>eixi)H=#*P& zdeD-4h$_c;lCC05CCQU&hYwm3=*hYN)-6yBXI9h)dJOefN5~Cmh`zzc2Cc*w+Q*EO zBEcR9$V-V}7m*-t&OmtQE$jUv7OMy&`xP}(ok*)&J@!isGBGn}ME~c!z)z)~)Pi>h zFsL08f*@fo1mu2HoS;Gn1fsxwhi~$KnX`fYDgXo65GcC2G{&zw{tL1Dk(=OzhX&W8J9alEOqEd z(Bj-B4%qg_Baj`koNoB`0#W=U_OZ!tT?aH!3=TkI{8#9ebDa3lYQV0Z`%V6MBfPZ1S5z1VH5o^N7n=CI~kPykyqc7_qW-{ zevy9Q?0trS+`08JQ`Y~y>K)?G$9TA^+KcOoXIWzDxrVKnI?wP7-k@O%#(OljEiFjw zvfu0uq zvP=D+h)r`>dlMI{U-m|}|6#H~{y#ROP00#2{UjK@SML~eD&Lyf2!U!NalEk?b2@;% zJ-QTJOm?&L`DsDv_F3k3QD+tZtFCQU0VK(yM!R$j14S4!9)%es;5^o}A_zfPvOK+Z zdAzevTsA?myXF=z20!7#>Gjn+MEoIvg%G_5m#NX%DVL7mRHHgiEV{It0=A5ctk%w1 zTbY)iSR7`6#*u=u0JFloAhC+Q5wl|CY(?r4oIH3|pp1xlZ52s|fPZ`gjAk>AduN_` z5a0}1%`DT0TUeR6yT?}~*M|yr5`d5`-l#GOn}NL3Xf%cWPB=6#u>G=@`C;J0Zr0ts z=#vt1T1KD+-`zm_eZs>78q1XP;rrj;ridu_HBD8yTE}lMxrmBUe|C6IB%{;PunKn% zPpMkrm&VP^F*Y_P9h@uo{xM1RgAQ<5uv5}vdtgX`~_b2zoRr-8Xg$*jqQ zZ#b!J`pNTi@TP5b9B~g0v;ofbPLKaVkUj1e@3#3Od!9o4SF6hhM)&_>b^r6FgZlrt z&j0Dk@xPl^YiY$04B~D*K(ZMk;hS6653|1_cg%4`vfQVdA=j`kOo3>Z%1If>qRn?a)-QlP6$QAG1AvcSjRV4lB&c16Q*j-d133pyBtr?&S! zqBl0vWUc1qrJws5^fZ@Lbr8RB1;P$pg5WY!zT`=igPZhjL*(+I>~cErD-`$)$R?K2 zt%5|>I2Um0b2Bhd&0&g`|4VIO0aw-1y?sRKPHChY>6A`EQ0eaO4r#oAAkrZv2uLG> zbVvvS(xDO}NC}EG0up|k>%CVFXXF2RU%%~d@QCm{YwdYvX3d(}v&97cJYL-)B_(QK z&6a-hSLpODOk7F z#OEwi0LFF)kRtUN85w zzlScb0w>>0@Q8fCesI_Lo>i`0uSXyq|60}yv<&zM=6f_EIfFj!jS99=)eK2mofp2= z>5zsS3|U~mOt-m};^*tM{Z&^-hpi|1vI3^}Q-P?Xd_h`X#3G{6x*C*Mwim@4j$*MZ zGzVhQ`m)`60<7Noga+*QAZd1l%2;km$@1L`87UsXig``lb+8R5ofSDk*w#scp)*At z@A=8(T?3}p3VwS8OIcosXxJk|l3r~iKLwYZnRoR1Jv|@;S-xoM)8!8 z^hMn*=BLBGZS}SrPM#Oh#uW@OEX z#3Ee1Bd#5K#1L}sWA@CW;%>Qa`&qOQk_2Q~%JITBf*e=NeyvjKyJnLk<4Town((%I zEYGzl_0%@08%8%c)<-Y&lt2ZH9F3UH5Vi=)CtBR#av*acW6BxMw;SDN$rF#{G9%75h~?h8hw^ zo!7z|ANJWVvBaz`#VnC0Nnx&EUe?Ciai^rQ)_9xc$yA+iUCWg73$C%gBAIo@sLN)- zQjf(j6U_^9MfJDJnv67k?CamwLs~|t!uYQFGz!HJms5Sh(DL?ZyrdN75~z#uIPM<3 zI%>DH`~)6aYrL?ocE|>OI1iz>Tts{Edv?CH*f8`-Q-0PQ`>qw-YSUfpn{{Plg&o~$ zVkot4tintW8Y^j+!a1B|Z8c?WE;UDaD5#d)G_pVwt%>0FfybZoTerM2QbqEllEQOZ zH~?!FF$EvZ@TJs8E2FC3k!&NjzW8j!R$tr+<`r?LntF#B_}!;?_Pohsw8p|$eVikm z z!E45KpX=exiMt>BJ6ja3@F5j7b+>$7-TJr|bXw9b_7$2rGOxsY3hKP!)?!V}e36KT zC%-L+9Sb4tJ(nq=&qnQ^-1((U+qPSGOpbi*QT14OEYl?`#ub;Du42^~oR%UPY+hYy z>FgPDT-i4Y26z6rr^us0YnFL+(ThaBNxPU#{p|;rZS@F2_$%WkL-#mT&gIo~w2$yT zR|$%{=Fpa7;ch7ONo(Zur6&_H*XY}xrFL>B#uVU*i!w&~Wb2(f2-bmMe5m4$eio^0 z!h=?p_nPbldm_WiQd+jztOK!M6v=}~rPk*!2N7cO@sjSk5WR@U!pd-M^G!~}@{?y<9LRQhlaQrf=HRYJ8l;K5=#+hg?_rhvrKqGNKxjLa!H^}#XX&A*m^Qa-dwSRQ z6SuJ;0`&UXo9Asa6X+k{bv?Y60hda^%aush%En#+oQK9NQ_3Ahzr%~t!EQ7{&68JMAgZlFQIX44J$W~mzE}^V*a%;7LhDc zlrFbWU0BTBST+{6c@_dS(#r97IT)il&z<1Oyj_wagefj}@>ojyu&g22N3Z)ieu)64{~HRz)|poH~@@rw-j4$bQlW~8JTw|G*Q zyfK|XR!1?R4e_6)&iw=_FzfNVCGjBp?2BA~<~%3e&i}#FD6DgiA@&p$LdgFIcC^CLpB^MDHYN z-66}!4qSPQE4nld%fb+~=})&3?Ddoku1b^pF|YV&>l62~zn1nXB^DoBD^kT2QboF$ zZ(u)fjnWgfKt-YE5>r)}yjc}0G+bqnK%nQ(gA!9YSWZ~05-%e-uDHt0jdFhJu327o zjYfO=7&HB}rshTbfM8RTxJAdIOwND;b2c{G4B=&}U~63DCQ7&Z&zHEzJ>$#+a>{dy zZg$SgzDY%|)ulBJpXgJ=)2ou}uDUpV6e5vLKN%U=eVu)XXT6$e=hJAJ@2GJyi`PbI9ijERS^(5fG%#v87Urk=LkSg80)pm4%F7tS2 zGQT=v@}kXQGdfDc^;JRJR~%dLDoopvM!bbc)^u-gItc|c!xQzaiM*>`U<(o5TCHa# zo<8)!o$9GxEAb&|x;NFgI*rnVJLR!nzurjJFMOcyN70nAIxVz!-shr!^y&iUdgvbY z!ObH=|1{ASqSb8l2ddv{Tzd7CMMtyz>f984Z6=8QvnzA_8l(?jCGu?BMN%MB(?w2)3Cco}J&=ymJ6Ihbeya@D=`i_rXAhm|v~*Ay+3w;DL?bmV;N7 zf%Kfe_>t#CN?nmCqJ(eIqMptx;mj#`;Xy9Hil)1gc0XpGQJM6o+fR=uUJK$hS z-!#d!tK^SS_0_(A*IT$pG<=D6KotH^8nb)~`!K!aV`}CU;^FFp^>3yv*Brtdi~?2z z+cRdaKkw^bYiww~`(#bz$ky1%azIc0;@4OGU*C*m1S-0z*k~QPH+>Zzpa^ge>x(GG zKK$gjU7aa<;n2K)S0|N|{Rrnd!@77g!z>X>Alms(q<{$bzynk<^^r=y?F_>$Y{G2^ z`;z?Coua05ha8LPQWh_Eun+hBwkb0GF}}+6@6IitMfdZ`ioI|Ye6i;z68O|9fZ{@? zq$kq>yJ#!@9-ipSjM(|71^PAL*rtGWl>=`77#F{gq5~GuP`(d)3O*qQNY{s1 znmP>@l4_<)1N`v&%|tp%*WP$0yr~J95`4GV5ZGkOaAg0k%`5c-tNmJ$Phe_8FRQ&v zX#HCSyp2OLn-!kzA$K>w{gkiB7ruJSWHvWGQ~$miTl#Xp9R(c%VI=?A^o;9Yuf~3V z;i`+HmHnTyZ;@yHP*uM}{}HR%g&=3vna#E8!vv!{`gsAM$8M;3eRAV{>j6 z)os7qsR+zr3U+G>Lts_T{oEEr-72m}!x$m|HrtIkbbDum+7lUWmY@PX55rSg`1arz z?U;I%^E#8GRwh!y_lB?OU%mdI;}|1N@F%*+*v{FfeT3rHLW8dPb@bN%1?n*Qkh zc!icMHx-w$lhoSZZZ_U=6WfjU zPer)8k8BoKw``aFKOdF~7B^JyG0JHj>cqBe_}JDKJ33B0d~PO)#DAoE0aG+kjB8pu z8*cwS>Tyb?D21;3Y|bB$Du zu*1WmN(>PN9%WwHa8yFezMg=Co5TuEe{^9h^I_^2LJ8j4zGkJd^s!o&YVH>o(>10d zlIU{F)Ko4vP9JJhM95@p^=eS~lwHpqBsMwdTYggSqA4YDf3Nr3{{6 zF0Jk2qI%LL*E!N9%cU!@r6p%5&{~-HiM)z!*d0U19CRkB-J86&(sB3#@D~;MIxgI%7k*VqCOYzmT%1O>*|w{$Di6s6@=I5) zkVT@(pciazIr6g*R!VKJVOLWQs^%0kSd}kICx+nMmDDnMti7xgU#>OS$3TS!|EMlk zGpnTjdZOBJ`6PK8wv$A>t+0hOe0F4n*X+H!ch@;Ml$aA|vg`|)3lWGOXOI42At1Nl zn>gbQoH(9kF=h37yZLQOuJOE^qIxC%_`u4Iz-ymTwr5_Bt+_`x#tyPhtUjjyP*m4~ z*wjof;L)~#K-WjE*hD4zE@vV`Ua$aT}B4sp$q4JxB7Y#LTof1$<(j?4@)W z22)L>dYPrzz4S$?WHrq%SJzS*Rtul(xG^bj-C*sRL2de_Nr!EZ#{eCw=MjTgqO(GOUZfI#f+ADxy)vkR`z%#gDv0rFT{gzu*}NrW#1G>fL(9C2mGsh9v}jW*8+2MG z>jVvr?~-*ktb=v^xDs-Xp2domRp%r+u}0gf;k!@Z3?h=V%b$pt=$X_5@*M zrdZwXpn>XVOQzCXji=#juHwBf8SiB0-7}1kN~8*J41i;pCd^(5K1v~C%Dgm#6(z9< zDHN~F#~_n}D-7L7a7E(DqH`tW$tD;HkIdv9iHyv`z{@mB&ws)3Vr^CYZL`4cXJSNQ zjh;^ulZ%8O#T)Z6!}2MD2c5VB5C+4t9FXA2Oh`QtoD2rU`-K)OBQDR&=e~W<)3imG z+5G-ivj=2qqv#EDgooJ2_iK1^t3g{Xxz5ere(RXcRv7)~pJ~jBk*$%2;x_XI)Cc(; zo|6&nT8tAnNZO^85tSC`c#l4v+AQ;g-!5VRIL8Iw}x(wckH{koIMgrw{Hf?sQV}R}I2L&iRX8KJdFL(>f8)6!(~-93cJ( z2V~j)s~lwCT&4{ezdfIQ7k#@4vVytSff;)66=|Nr%ZK8?0IvI5W9uSw{OZQ;bzn%o z%<+{AU=wOCRVGJ&FECvi=#P?cahTUwY0KcaKh}MOIkpD$#V>%@A)ehI^FUaCsXul$ zvjFnke~z<^|Gpnih?`OZ^4~93eNot~T2rbvUrJH5Ft7GVFp-kQw8GiCd*1@y+%*F^7)wHt)3*ey2q!+EcBvn3`T7cQUEj$($_x`Lj8NjQh^MU#g3 zsV!ww8O~Nv%U+@uU4DP4CA2*EZSl^tn{)wpX}5W38SBG>HM4M3S&BF*6s|?!sjxfe zB#vgdkxuV(#Tun{fP?57$Xsq(vHCN@>W)u@V8$Uqvor{{TwZ_VZjm#OZ$)dzOrL|NE6 zQ{}e5P)NBg1aH7yzgw42q&3sXv=Oj(*rQGnf>NqRbDcQiiq7qRX_d6GG(lMbUX}`F zWxpsvhUi27yr#L%zK?c@d2xwYxxL8GM6Wr$FW#Z%vc#e%xx?crwazBfde;j58G+k| z*<_Dv&iG)&3%}TQiZq#=L0WE4HPb#xe<2GOG7Fv$X-fwkUW@+kmv^dN)ZaM0cIiv* z^G`cGirDO^eSVupWXXmYr&W3w!A-gNb+3rw!x=2p*zcs3&1JG$OG7g(PnG( z4&<+2x>uUwl`yLGkGbm)m&-)3T2)b|qLkKW0+9`uf9IlwReF=En@gHeZZN z)Y+MGdCLU~67J=^=0WM|q24@frW__JO{BcN*OJ|QWSq4ZMOP^E$arC!4qa^tZivzJ zJ;fo)RTdhTyorJ#Y124N*3xm266O3ins+^U>4o&< z;7*?_;sq8;lEVO|%bK%=TIN`3Ta`&0j20;FT|K19AIIv1R? zTx;)&5K=EoEJ!g))Kk*RIi*19k-$ccn5!^pkrb7z7Mk(I`Jq<}%KD}ICRZHP zdeh>NScjag78RvacD#ctcDNF)XqRwYZPcwAEctIFdW^r%Go5EM@Wj`exR0RFxRd?a$6IVnV`%sus3#uG}lPBXjP{vh<7;b;kq)_a8~Pv4h(q*@wKZ@I-~R`QT^ zeC+Yf1pD-7Dp#`lxn{*4P3Gu0Uf75h$>#Pux^Je`Caau&^e8r9!Is*0<4ZZxsv)*W zyYTavcdG8(5A6nJF3At`Hh()mvPf39Vkj$HE$OA zTy|^^vah*#X3WgHhhrJZa#KraK`1bmT`@RA(xErEFQQmS=r z#6GOcR@K;qvWk_?rvF|T`VGltpAcF6nhxCq!D;^Iq4>LB9oI<$O2d)SCn%^e!%ds! zxEPc*LT7Gt;@u4`wU~2)pTd|+wPluarjmO7Nc~#y=qk!XjK**8Dtun?GeWCAwK2bGuDYyx8sJBU|i9th$(=!x>4A3-(|P^ga>BT5}BDA>b8dGEPo z^yOtro&43HY;^5dTrBiEZBebJH3ftPO5#?fXuMMri2Q;UdeYf=+^tPM1b3XU6@74a zCEvXf=Z;q?^NIaK`ZF(&t%}p!ax5mBP`f@`LJM$6^l7L8Vqjj z@wfZ)$dxR`x-@36m$e8-e3 zHmoy<0_$#w`Lrt)sd7?P!Np)T+Z&^FzN%Y7s7q3&xet0DKI#3+5wp(Bo)#UOhsKxt zRD2rInvoULPSl-sD68#}ksQ^;+R%}8LGcq-L2LvTyQ+JRVIy7RFFMz631+tTL*HJyQplgb}N#4zC>?$^RFZ8kY?xYH(aIF zQ%fGX^YVk9Nih1-aF&S|knZ1+ZOJ*Cn_gQt_*>59)iZGOuem$z{*GY+)!J|mMubna-fr3fPEAkAVE|0|}ji_{4dI%Z4{pc`Obp4BV z`A&ECUF)K>&$h*%o~F$oJ##v2E_oJ^f*~sMe13eZ;QHciO^+)Pa2+~nMse8nitt@M zANvJwR*pIK&?YgJj5?Lj^)1Z^6+iL)$i;MTK^%_Js5+1DNWf$hV#?4A?32_ngoLvr zNoEGLbyv6EX#MisYnOlU8L`~7mbYjFq?B&_4N~A_oD@0NOCy{?q-1L_Ty59P&V(nrW+ zUGoZQ{hi||8*X!(L3VQ)F&Zv=sc92L--3KNk_=`JLW&!s4wyG&(+pxO-$eUMKBL;j zpPPyi?VmT8`&x?ZN3w^o;U*vyZ})`Ey_r3tS!oo$-Uu_IRiE(o`m!aRn9?Yj<7LvT z(-K*ec!_Ei2Z02&hNYpwtuGkEgYPL2eq;q6Ifd8qMtm;Hk+z6V?~=ZcGPWQhb%a_= zwTrVc)!88>{J}r^1HVDfu7PRie4g{6cAtOB=6u9ANk6KjewSxdHX1PwRH;Ftl8NDA z?rcd-x=-rAh1`kB`M#NsJ}#Yn9N21A1Plkqoeczn1U&q4`XYvqpYCkzU0jWTSG=-0 z+StlS5dWkP34mi{J05iGE+cCI@Q~y3GbV0mCN@(eSEI}BX3j1^?m|X_{U=O6a>ge= zaj>Ht(`$x#&jWr!j?3Bf1P}pedSfqFGY4l=GiMnIo?oW^(+pcHS65rJV-tdfXNeF1 z`r~r83DgiqXcNBQ0T(l8D zUFOaXx6JGfzMo$GXO*#^1~7SQxr+t-(s6+X&;-5%3&3$2;QEC}rQiV5pa7hw0pf4> zxk5;Qp9KoE1;>jYuoiHg1|U!otOExaAO!>9J`E6ei@lHrFyOdATX2IP41nh}K!4=p z!F-@zjtexv7AOEvtZ2~bm%_1-##wT2+=_A2HUl8!e}z+2AVenxCh4t8i8F46yYCD{ykzV3f!?30|1T- zG(xmCD8fIQ{2SqHMcvQ=MS#)dPZVVaiU6a@pD4-^6ahw)N`6=K!CUthI0B3&p9@Bq zf+Ki3f!YA0NwX_EaALqfe_WvJViz0%Mw3f9j%U~q?FniFj3yV@iFwcHC%wQBxL`C% z_nKV{{61*j0!4t)B!{m<;0Q39>`g5d0JnkA2h;`_O}evNKLEF(1{?uKlR>29 zp5Qi&`hwa3qsi)*3Q6Dyo_?SRFq&M)W|0R+*ab&`(Igedrz_wHp8lXVz-aO_I@Qb> zss=}Z(WDRd3m0%3qC>!J;D*s;4*zYQPN0W7F3>HDKNJ)JMw2xCe7)c{Xx;%ufYGF| z%!Ltf8+O4FU^J=KHjWBz17SF*4KSL#O`+}xZbJ4UVu2jsT;{^R}pGvFIS;rE{K=p;z-aO*&H3U0;7%SF=sQ^hjsT;{ zd=(Wu24D&PxIiOBr-0f3qe(S|`epE#mOm2=ffq)Tu{GS-NPq{&1=@y8a0D1lDmZ#w zM}h+ofC7y`_z=_v7)|;cKhOoQi~HH22r!ydS!cxW1Uxt{&^GYrfFi(X(nTc?7u*KT zN1zBWnv|>VGXO`}1xJ9<#pq98m)ld;sOgbsr4j zI6e72eSilfHjin6#MXWVCOaAgk`5#bfVujKOLqN~5hf0%W|s{N{(M&0z~J(a4X!8O z)n;aI=KMYJ1+06WChJ=;!+%E)ffxf3_tg_rz{jKine4|h&S_e9D|+VRSC1&MK_J(m zXzl6FK~G2j4Wj*Kl>gS zy(Afa4|KrCIsvNs#KofcYi67{EX>r=h!e!+gAhSM24Gt}JQV~YcY+B5DO34hxz6@* z!_I~$7!dWfOAv?z6sxDve`a+t1M1h+?0BExX;oEfknJo2Ilp0kfD?)@!TNXbo$aYZ zUpap&Fbq)w-U4aL6Bob#zh(aZsDYWMiLINd8F1p8iw%g2?`rq;M-d^AM}V8sCukrL zo1p)R=xpDJ8;8(`0ICci@go35xfuR)%74x<0Jc=>LW1Y|nbHVbpg6ObkGcDL^r5Cj6Z7>>2}xnZL#vJ0p7wTQdU= z5Le@jRZUs|!dF01gCd?t{H?@i`#zVTH|7oajSlpz&@J)i{hyogSFM^lejhx)H^;xK z7Q|P*sR->lfQSZIv4d`j3Mu~+(b>NB>#NVb1#W92OudGu{haa_>XjYD*YJ@s-d50h zT~7b4#Ao{+*^M6i5NNG9K-9nuB`sy3V}eRxpBXWHuhKuif;dUsupPDnw9{f>Q#AKoLj(-1K*q`Jgc%UX2+#jlL(aZ8-bq1oDZmJz2uxI=BdPuCzh=_kJ;K>xII2b| zLlDphm;zjKQ0_CS{I6VRd-zQF{dIbv#qR(GI>J!a_*bl;vkaK}<^T)E`S6+E0Rbtb z2e`wUP#*JX{ci5F??4ub;mQcWE(+7{IqUq~ieKpW1VHp2VLIU63J}B2G3RuDEAiRB zBR@UAaXjKZf*J9Y^?z={>9+s3zJbgEOy%=~I8Q_*Zv#H!^&9?P=Ci%etjpGG0cO{o zz}y8$w4J!3%zn)VS0Kj)yxssbtYK78m5IlIKrYgs&K(Zg{CAeKy;A$^(mIF&foKDp z1fji}yY;X5{%+9@Zmy1Qt_G%N<{;UT<;l#qK@c)A8K% zbe!i_``;MO_Qs&#(Y50hLtY@>hEBKA&iq@h?>*V~uddEU_AbXMB!llAHi&yC-|Pdu zNGY@Yn<&rr_vE`y#DO;aI(2A!ij4QScLd@y$Te;*}j}Sr-SDN5wPiq>DQ?KIn?E}HzyzRh2G{+%km#7 z&i3czGpo>Rm{Z)pMh5j1@oAqe+tAPnJ&N8-L4 z{sZUa(`V2)szRr5pdNTTjdSu5G6E=jhEL=C^W@rTjFS&}QA1&na2@4tzGMD6jl3&0**Zm=XBi@iGkrk_7xY{`v1e G`~Lu`s`C5* literal 0 HcmV?d00001 diff --git a/examples/water/lmp/jax_dpa2.lammps b/examples/water/lmp/jax_dpa2.lammps new file mode 100644 index 0000000000..c9fdeac47d --- /dev/null +++ b/examples/water/lmp/jax_dpa2.lammps @@ -0,0 +1,31 @@ + + +# bulk water + +units metal +boundary p p p +atom_style atomic +# Below line is required when using DPA-2 with the JAX backend +atom_modify map yes + +neighbor 2.0 bin +neigh_modify every 10 delay 0 check no + +read_data water.lmp +mass 1 16 +mass 2 2 + +# See https://deepmd.rtfd.io/lammps/ for usage +pair_style deepmd frozen_model.savedmodel +# If atom names (O H in this example) are not set in the pair_coeff command, the type_map defined by the training parameter will be used by default. +pair_coeff * * O H + +velocity all create 330.0 23456789 + +fix 1 all nvt temp 330.0 330.0 0.5 +timestep 0.0005 +thermo_style custom step pe ke etotal temp press vol +thermo 100 +dump 1 all custom 100 water.dump id type x y z + +run 1000 diff --git a/source/api_c/include/c_api.h b/source/api_c/include/c_api.h index c34a6909a5..a8798ba24d 100644 --- a/source/api_c/include/c_api.h +++ b/source/api_c/include/c_api.h @@ -12,7 +12,7 @@ extern "C" { /** C API version. Bumped whenever the API is changed. * @since API version 22 */ -#define DP_C_API_VERSION 24 +#define DP_C_API_VERSION 25 /** * @brief Neighbor list. @@ -31,7 +31,7 @@ extern DP_Nlist* DP_NewNlist(int inum_, int* ilist_, int* numneigh_, int** firstneigh_); -/* +/** * @brief Create a new neighbor list with communication capabilities. * @details This function extends DP_NewNlist by adding support for parallel * communication, allowing the neighbor list to be used in distributed @@ -68,7 +68,7 @@ extern DP_Nlist* DP_NewNlist_comm(int inum_, int* recvproc, void* world); -/* +/** * @brief Set mask for a neighbor list. * * @param nl Neighbor list. @@ -78,6 +78,16 @@ extern DP_Nlist* DP_NewNlist_comm(int inum_, **/ extern void DP_NlistSetMask(DP_Nlist* nl, int mask); +/** + * @brief Set mapping for a neighbor list. + * + * @param nl Neighbor list. + * @param mapping mapping from all atoms to real atoms, in size nall. + * @since API version 25 + * + **/ +extern void DP_NlistSetMapping(DP_Nlist* nl, int* mapping); + /** * @brief Delete a neighbor list. * diff --git a/source/api_c/include/deepmd.hpp b/source/api_c/include/deepmd.hpp index dd212e9dec..8a3656bfc2 100644 --- a/source/api_c/include/deepmd.hpp +++ b/source/api_c/include/deepmd.hpp @@ -863,6 +863,11 @@ struct InputNlist { * @brief Set mask for this neighbor list. */ void set_mask(int mask) { DP_NlistSetMask(nl, mask); }; + /** + * @brief Set mapping for this neighbor list. + * @param mapping mapping from all atoms to real atoms, in size nall. + */ + void set_mapping(int *mapping) { DP_NlistSetMapping(nl, mapping); }; }; /** diff --git a/source/api_c/src/c_api.cc b/source/api_c/src/c_api.cc index eba9be3664..4a0cff1520 100644 --- a/source/api_c/src/c_api.cc +++ b/source/api_c/src/c_api.cc @@ -43,6 +43,9 @@ DP_Nlist* DP_NewNlist_comm(int inum_, return new_nl; } void DP_NlistSetMask(DP_Nlist* nl, int mask) { nl->nl.set_mask(mask); } +void DP_NlistSetMapping(DP_Nlist* nl, int* mapping) { + nl->nl.set_mapping(mapping); +} void DP_DeleteNlist(DP_Nlist* nl) { delete nl; } // DP Base Model diff --git a/source/api_cc/include/DeepPotJAX.h b/source/api_cc/include/DeepPotJAX.h new file mode 100644 index 0000000000..76533fcc35 --- /dev/null +++ b/source/api_cc/include/DeepPotJAX.h @@ -0,0 +1,289 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#pragma once + +#include +#include + +#include "DeepPot.h" +#include "common.h" +#include "neighbor_list.h" + +namespace deepmd { +/** + * @brief TensorFlow implementation for Deep Potential. + **/ +class DeepPotJAX : public DeepPotBackend { + public: + /** + * @brief DP constructor without initialization. + **/ + DeepPotJAX(); + virtual ~DeepPotJAX(); + /** + * @brief DP constructor with initialization. + * @param[in] model The name of the frozen model file. + * @param[in] gpu_rank The GPU rank. Default is 0. If < 0, use CPU. + * @param[in] file_content The content of the model file. If it is not empty, + *DP will read from the string instead of the file. + **/ + DeepPotJAX(const std::string& model, + const int& gpu_rank = 0, + const std::string& file_content = ""); + /** + * @brief Initialize the DP. + * @param[in] model The name of the frozen model file. + * @param[in] gpu_rank The GPU rank. Default is 0. If < 0, use CPU. + * @param[in] file_content The content of the model file. If it is not empty, + *DP will read from the string instead of the file. + **/ + void init(const std::string& model, + const int& gpu_rank = 0, + const std::string& file_content = ""); + /** + * @brief Get the cutoff radius. + * @return The cutoff radius. + **/ + double cutoff() const { + assert(inited); + return rcut; + }; + /** + * @brief Get the number of types. + * @return The number of types. + **/ + int numb_types() const { + assert(inited); + return ntypes; + }; + /** + * @brief Get the number of types with spin. + * @return The number of types with spin. + **/ + int numb_types_spin() const { + assert(inited); + return 0; + }; + /** + * @brief Get the dimension of the frame parameter. + * @return The dimension of the frame parameter. + **/ + int dim_fparam() const { + assert(inited); + return dfparam; + }; + /** + * @brief Get the dimension of the atomic parameter. + * @return The dimension of the atomic parameter. + **/ + int dim_aparam() const { + assert(inited); + return daparam; + }; + /** + * @brief Get the type map (element name of the atom types) of this model. + * @param[out] type_map The type map of this model. + **/ + void get_type_map(std::string& type_map); + + /** + * @brief Get whether the atom dimension of aparam is nall instead of fparam. + * @param[out] aparam_nall whether the atom dimension of aparam is nall + *instead of fparam. + **/ + bool is_aparam_nall() const { + assert(inited); + return false; + }; + + // forward to template class + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew_mixed_type(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + void computew_mixed_type(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + + private: + bool inited; + // device + std::string device; + // the cutoff radius + double rcut; + // the number of types + int ntypes; + // the dimension of the frame parameter + int dfparam; + // the dimension of the atomic parameter + int daparam; + // type map + std::string type_map; + // sel + std::vector sel; + // number of neighbors + int nnei; + // padding to nall + int padding_to_nall = 0; + // padding for nloc + int padding_for_nloc = 0; + /** TF C API objects. + * @{ + */ + TF_Graph* graph; + TF_Status* status; + TF_Session* session; + TF_SessionOptions* sessionopts; + TFE_ContextOptions* ctx_opts; + TFE_Context* ctx; + std::vector func_vector; + /** + * @} + */ + // neighbor list data + NeighborListData nlist_data; + /** + * @brief Evaluate the energy, force, virial, atomic energy, and atomic virial + *by using this DP. + * @param[out] ener The system energy. + * @param[out] force The force on each atom. + * @param[out] virial The virial. + * @param[out] atom_energy The atomic energy. + * @param[out] atom_virial The atomic virial. + * @param[in] coord The coordinates of atoms. The array should be of size + *nframes x natoms x 3. + * @param[in] atype The atom types. The list should contain natoms ints. + * @param[in] box The cell of the region. The array should be of size nframes + *x 9. + * @param[in] fparam The frame parameter. The array can be of size : + * nframes x dim_fparam. + * dim_fparam. Then all frames are assumed to be provided with the same + *fparam. + * @param[in] aparam The atomic parameter The array can be of size : + * nframes x natoms x dim_aparam. + * natoms x dim_aparam. Then all frames are assumed to be provided with the + *same aparam. + * @param[in] atomic Whether to compute the atomic energy and virial. + **/ + template + void compute(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); + + /** + * @brief Evaluate the energy, force, virial, atomic energy, and atomic virial + *by using this DP. + * @param[out] ener The system energy. + * @param[out] force The force on each atom. + * @param[out] virial The virial. + * @param[out] atom_energy The atomic energy. + * @param[out] atom_virial The atomic virial. + * @param[in] coord The coordinates of atoms. The array should be of size + *nframes x natoms x 3. + * @param[in] atype The atom types. The list should contain natoms ints. + * @param[in] box The cell of the region. The array should be of size nframes + *x 9. + * @param[in] nghost The number of ghost atoms. + * @param[in] lmp_list The input neighbour list. + * @param[in] ago Update the internal neighbour list if ago is 0. + * @param[in] fparam The frame parameter. The array can be of size : + * nframes x dim_fparam. + * dim_fparam. Then all frames are assumed to be provided with the same + *fparam. + * @param[in] aparam The atomic parameter The array can be of size : + * nframes x natoms x dim_aparam. + * natoms x dim_aparam. Then all frames are assumed to be provided with the + *same aparam. + * @param[in] atomic Whether to compute atomic energy and virial. + **/ + template + void compute(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic); +}; +} // namespace deepmd diff --git a/source/api_cc/include/common.h b/source/api_cc/include/common.h index 9b1adcbd62..def3df933b 100644 --- a/source/api_cc/include/common.h +++ b/source/api_cc/include/common.h @@ -13,7 +13,7 @@ namespace deepmd { typedef double ENERGYTYPE; -enum DPBackend { TensorFlow, PyTorch, Paddle, Unknown }; +enum DPBackend { TensorFlow, PyTorch, Paddle, JAX, Unknown }; struct NeighborListData { /// Array stores the core region atom's index diff --git a/source/api_cc/src/DeepPot.cc b/source/api_cc/src/DeepPot.cc index b47c8a9ba1..6f8724f78e 100644 --- a/source/api_cc/src/DeepPot.cc +++ b/source/api_cc/src/DeepPot.cc @@ -7,6 +7,7 @@ #include "AtomMap.h" #include "common.h" #ifdef BUILD_TENSORFLOW +#include "DeepPotJAX.h" #include "DeepPotTF.h" #endif #ifdef BUILD_PYTORCH @@ -41,6 +42,9 @@ void DeepPot::init(const std::string& model, backend = deepmd::DPBackend::PyTorch; } else if (model.length() >= 3 && model.substr(model.length() - 3) == ".pb") { backend = deepmd::DPBackend::TensorFlow; + } else if (model.length() >= 11 && + model.substr(model.length() - 11) == ".savedmodel") { + backend = deepmd::DPBackend::JAX; } else { throw deepmd::deepmd_exception("Unsupported model file format"); } @@ -58,6 +62,14 @@ void DeepPot::init(const std::string& model, #endif } else if (deepmd::DPBackend::Paddle == backend) { throw deepmd::deepmd_exception("PaddlePaddle backend is not supported yet"); + } else if (deepmd::DPBackend::JAX == backend) { +#ifdef BUILD_TENSORFLOW + dp = std::make_shared(model, gpu_rank, file_content); +#else + throw deepmd::deepmd_exception( + "TensorFlow backend is not built, which is used to load JAX2TF " + "SavedModels"); +#endif } else { throw deepmd::deepmd_exception("Unknown file type"); } diff --git a/source/api_cc/src/DeepPotJAX.cc b/source/api_cc/src/DeepPotJAX.cc new file mode 100644 index 0000000000..be1a5542b4 --- /dev/null +++ b/source/api_cc/src/DeepPotJAX.cc @@ -0,0 +1,783 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#ifdef BUILD_TENSORFLOW + +#include "DeepPotJAX.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" +#include "device.h" +#include "errors.h" + +#define PADDING_FACTOR 1.05 + +inline void check_status(TF_Status* status) { + if (TF_GetCode(status) != TF_OK) { + throw deepmd::deepmd_exception("TensorFlow C API Error: " + + std::string(TF_Message(status))); + } +} + +inline void find_function(TF_Function*& found_func, + const std::vector& funcs, + const std::string func_name) { + for (size_t i = 0; i < funcs.size(); i++) { + TF_Function* func = funcs[i]; + const char* name = TF_FunctionName(func); + std::string name_(name); + // remove trailing integer e.g. _123 + std::string::size_type pos = name_.find_last_not_of("0123456789_"); + if (pos != std::string::npos) { + name_ = name_.substr(0, pos + 1); + } + if (name_ == "__inference_" + func_name) { + found_func = func; + return; + } + } + found_func = NULL; +} + +inline TF_DataType get_data_tensor_type(const std::vector& data) { + return TF_DOUBLE; +} + +inline TF_DataType get_data_tensor_type(const std::vector& data) { + return TF_FLOAT; +} + +inline TF_DataType get_data_tensor_type(const std::vector& data) { + return TF_INT32; +} + +inline TF_DataType get_data_tensor_type(const std::vector& data) { + return TF_INT64; +} + +inline TFE_Op* get_func_op(TFE_Context* ctx, + const std::string func_name, + const std::vector& funcs, + const std::string device, + TF_Status* status) { + TF_Function* func = NULL; + find_function(func, funcs, func_name); + if (func == NULL) { + throw std::runtime_error("Function " + func_name + " not found"); + } + const char* real_func_name = TF_FunctionName(func); + // execute the function + TFE_Op* op = TFE_NewOp(ctx, real_func_name, status); + check_status(status); + TFE_OpSetDevice(op, device.c_str(), status); + check_status(status); + return op; +} + +template +inline T get_scalar(TFE_Context* ctx, + const std::string func_name, + const std::vector& funcs, + const std::string device, + TF_Status* status) { + TFE_Op* op = get_func_op(ctx, func_name, funcs, device, status); + check_status(status); + TFE_TensorHandle* retvals[1]; + int nretvals = 1; + TFE_Execute(op, retvals, &nretvals, status); + check_status(status); + TFE_TensorHandle* retval = retvals[0]; + TF_Tensor* tensor = TFE_TensorHandleResolve(retval, status); + check_status(status); + T* data = (T*)TF_TensorData(tensor); + // copy data + T result = *data; + // deallocate + TFE_DeleteOp(op); + TF_DeleteTensor(tensor); + TFE_DeleteTensorHandle(retval); + return result; +} + +template +inline std::vector get_vector(TFE_Context* ctx, + const std::string func_name, + const std::vector& funcs, + const std::string device, + TF_Status* status) { + TFE_Op* op = get_func_op(ctx, func_name, funcs, device, status); + check_status(status); + TFE_TensorHandle* retvals[1]; + int nretvals = 1; + TFE_Execute(op, retvals, &nretvals, status); + check_status(status); + TFE_TensorHandle* retval = retvals[0]; + // copy data + std::vector result; + tensor_to_vector(result, retval, status); + // deallocate + TFE_DeleteTensorHandle(retval); + TFE_DeleteOp(op); + return result; +} + +inline std::vector get_vector_string( + TFE_Context* ctx, + const std::string func_name, + const std::vector& funcs, + const std::string device, + TF_Status* status) { + TFE_Op* op = get_func_op(ctx, func_name, funcs, device, status); + check_status(status); + TFE_TensorHandle* retvals[1]; + int nretvals = 1; + TFE_Execute(op, retvals, &nretvals, status); + check_status(status); + TFE_TensorHandle* retval = retvals[0]; + TF_Tensor* tensor = TFE_TensorHandleResolve(retval, status); + check_status(status); + // calculate the number of bytes in each string + const void* data = TF_TensorData(tensor); + int64_t bytes_each_string = + TF_TensorByteSize(tensor) / TF_TensorElementCount(tensor); + // copy data + std::vector result; + for (int ii = 0; ii < TF_TensorElementCount(tensor); ++ii) { + const TF_TString* datastr = + static_cast(static_cast( + static_cast(data) + ii * bytes_each_string)); + const char* dst = TF_TString_GetDataPointer(datastr); + size_t dst_len = TF_TString_GetSize(datastr); + result.push_back(std::string(dst, dst_len)); + } + + // deallocate + TFE_DeleteOp(op); + TF_DeleteTensor(tensor); + TFE_DeleteTensorHandle(retval); + return result; +} + +template +inline TF_Tensor* create_tensor(const std::vector& data, + const std::vector& shape) { + TF_Tensor* tensor = + TF_AllocateTensor(get_data_tensor_type(data), shape.data(), shape.size(), + data.size() * sizeof(T)); + memcpy(TF_TensorData(tensor), data.data(), TF_TensorByteSize(tensor)); + return tensor; +} + +template +inline TFE_TensorHandle* add_input(TFE_Op* op, + const std::vector& data, + const std::vector& data_shape, + TF_Tensor*& data_tensor, + TF_Status* status) { + data_tensor = create_tensor(data, data_shape); + TFE_TensorHandle* handle = TFE_NewTensorHandle(data_tensor, status); + check_status(status); + + TFE_OpAddInput(op, handle, status); + check_status(status); + return handle; +} + +template +inline void tensor_to_vector(std::vector& result, + TFE_TensorHandle* retval, + TF_Status* status) { + TF_Tensor* tensor = TFE_TensorHandleResolve(retval, status); + check_status(status); + T* data = (T*)TF_TensorData(tensor); + // copy data + result.resize(TF_TensorElementCount(tensor)); + for (int i = 0; i < TF_TensorElementCount(tensor); i++) { + result[i] = data[i]; + } + // Delete the tensor to free memory + TF_DeleteTensor(tensor); +} + +deepmd::DeepPotJAX::DeepPotJAX() : inited(false) {} +deepmd::DeepPotJAX::DeepPotJAX(const std::string& model, + const int& gpu_rank, + const std::string& file_content) + : inited(false) { + init(model, gpu_rank, file_content); +} +void deepmd::DeepPotJAX::init(const std::string& model, + const int& gpu_rank, + const std::string& file_content) { + if (inited) { + std::cerr << "WARNING: deepmd-kit should not be initialized twice, do " + "nothing at the second call of initializer" + << std::endl; + return; + } + + const char* saved_model_dir = model.c_str(); + graph = TF_NewGraph(); + status = TF_NewStatus(); + + sessionopts = TF_NewSessionOptions(); + int num_intra_nthreads, num_inter_nthreads; + get_env_nthreads(num_intra_nthreads, num_inter_nthreads); + // https://github.com/Neargye/hello_tf_c_api/blob/51516101cf59408a6bb456f7e5f3c6628e327b3a/src/tf_utils.cpp#L400-L401 + // https://github.com/Neargye/hello_tf_c_api/blob/51516101cf59408a6bb456f7e5f3c6628e327b3a/src/tf_utils.cpp#L364-L379 + // The following is an equivalent of setting this in Python: + // config = tf.ConfigProto( allow_soft_placement = True ) + // config.gpu_options.allow_growth = True + // config.gpu_options.per_process_gpu_memory_fraction = percentage + // Create a byte-array for the serialized ProtoConfig, set the mandatory bytes + // (first three and last four) + std::array config = { + {0x10, static_cast(num_intra_nthreads), 0x28, + static_cast(num_inter_nthreads), 0x32, 0xb, 0x9, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x1, 0x38, 0x1}}; + + // Convert the desired percentage into a byte-array. + double gpu_memory_fraction = 0.9; + auto bytes = reinterpret_cast(&gpu_memory_fraction); + + // Put it to the config byte-array, from 7 to 14: + for (std::size_t i = 0; i < sizeof(gpu_memory_fraction); ++i) { + config[i + 7] = bytes[i]; + } + + TF_SetConfig(sessionopts, config.data(), config.size(), status); + check_status(status); + + TF_Buffer* runopts = NULL; + + const char* tags = "serve"; + int ntags = 1; + + session = TF_LoadSessionFromSavedModel(sessionopts, runopts, saved_model_dir, + &tags, ntags, graph, NULL, status); + check_status(status); + + int nfuncs = TF_GraphNumFunctions(graph); + // allocate memory for the TF_Function* array + func_vector.resize(nfuncs); + TF_Function** funcs = func_vector.data(); + TF_GraphGetFunctions(graph, funcs, nfuncs, status); + check_status(status); + + ctx_opts = TFE_NewContextOptions(); + TFE_ContextOptionsSetConfig(ctx_opts, config.data(), config.size(), status); + check_status(status); + ctx = TFE_NewContext(ctx_opts, status); + check_status(status); +#if GOOGLE_CUDA || TENSORFLOW_USE_ROCM + int gpu_num; + DPGetDeviceCount(gpu_num); // check current device environment + if (gpu_num > 0 && gpu_rank >= 0) { + DPErrcheck(DPSetDevice(gpu_rank % gpu_num)); + device = "/gpu:" + std::to_string(gpu_rank % gpu_num); + } else { + device = "/cpu:0"; + } +#else + device = "/cpu:0"; +#endif // GOOGLE_CUDA || TENSORFLOW_USE_ROCM + + // add all functions, otherwise the function will not be found + // even for tf.cond + for (size_t i = 0; i < func_vector.size(); i++) { + TF_Function* func = func_vector[i]; + TFE_ContextAddFunction(ctx, func, status); + check_status(status); + } + + rcut = get_scalar(ctx, "get_rcut", func_vector, device, status); + dfparam = + get_scalar(ctx, "get_dim_fparam", func_vector, device, status); + daparam = + get_scalar(ctx, "get_dim_aparam", func_vector, device, status); + std::vector type_map_ = + get_vector_string(ctx, "get_type_map", func_vector, device, status); + // deepmd-kit stores type_map as a concatenated string, split by ' ' + type_map = type_map_[0]; + for (size_t i = 1; i < type_map_.size(); i++) { + type_map += " " + type_map_[i]; + } + ntypes = type_map_.size(); + sel = get_vector(ctx, "get_sel", func_vector, device, status); + nnei = std::accumulate(sel.begin(), sel.end(), decltype(sel)::value_type(0)); + inited = true; +} + +deepmd::DeepPotJAX::~DeepPotJAX() { + if (inited) { + TF_DeleteSession(session, status); + TF_DeleteGraph(graph); + TF_DeleteSessionOptions(sessionopts); + TF_DeleteStatus(status); + TFE_DeleteContext(ctx); + TFE_DeleteContextOptions(ctx_opts); + for (size_t i = 0; i < func_vector.size(); i++) { + TF_DeleteFunction(func_vector[i]); + } + } +} + +template +void deepmd::DeepPotJAX::compute(std::vector& ener, + std::vector& force_, + std::vector& virial, + std::vector& atom_energy_, + std::vector& atom_virial_, + const std::vector& dcoord, + const std::vector& datype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam_, + const bool atomic) { + std::vector coord, force, aparam, atom_energy, atom_virial; + std::vector ener_double, force_double, virial_double, + atom_energy_double, atom_virial_double; + std::vector atype, fwd_map, bkw_map; + int nghost_real, nall_real, nloc_real; + int nall = datype.size(); + // nlist passed to the model + int nframes = nall > 0 ? (dcoord.size() / 3 / nall) : 1; + int nghost = 0; + + select_real_atoms_coord(coord, atype, aparam, nghost_real, fwd_map, bkw_map, + nall_real, nloc_real, dcoord, datype, aparam_, nghost, + ntypes, nframes, daparam, nall, false); + + if (nloc_real == 0) { + // no real atoms, fill 0 for all outputs + // this can prevent a Xla error + ener.resize(nframes, 0.0); + force_.resize(static_cast(nframes) * nall * 3, 0.0); + virial.resize(static_cast(nframes) * 9, 0.0); + atom_energy_.resize(static_cast(nframes) * nall, 0.0); + atom_virial_.resize(static_cast(nframes) * nall * 9, 0.0); + return; + } + + // cast coord, fparam, and aparam to double - I think it's useless to have a + // float model interface + std::vector coord_double(coord.begin(), coord.end()); + std::vector box_double(box.begin(), box.end()); + std::vector fparam_double(fparam.begin(), fparam.end()); + std::vector aparam_double(aparam.begin(), aparam.end()); + + TFE_Op* op; + if (atomic) { + op = get_func_op(ctx, "call_with_atomic_virial", func_vector, device, + status); + } else { + op = get_func_op(ctx, "call_without_atomic_virial", func_vector, device, + status); + } + std::vector input_list(5); + std::vector data_tensor(5); + // coord + std::vector coord_shape = {nframes, nloc_real, 3}; + input_list[0] = + add_input(op, coord_double, coord_shape, data_tensor[0], status); + // atype + std::vector atype_shape = {nframes, nloc_real}; + input_list[1] = add_input(op, atype, atype_shape, data_tensor[1], status); + // box + int box_size = box_double.size() > 0 ? 3 : 0; + std::vector box_shape = {nframes, box_size, box_size}; + input_list[2] = add_input(op, box_double, box_shape, data_tensor[2], status); + // fparam + std::vector fparam_shape = {nframes, dfparam}; + input_list[3] = + add_input(op, fparam_double, fparam_shape, data_tensor[3], status); + // aparam + std::vector aparam_shape = {nframes, nloc_real, daparam}; + input_list[4] = + add_input(op, aparam_double, aparam_shape, data_tensor[4], status); + // execute the function + int nretvals = 6; + TFE_TensorHandle* retvals[nretvals]; + + TFE_Execute(op, retvals, &nretvals, status); + check_status(status); + + // copy data + // for atom virial, the order is: + // Identity_15 energy -1, -1, 1 + // Identity_16 energy_derv_c -1, -1, 1, 9 (may pop) + // Identity_17 energy_derv_c_redu -1, 1, 9 + // Identity_18 energy_derv_r -1, -1, 1, 3 + // Identity_19 energy_redu -1, 1 + // Identity_20 mask (int32) -1, -1 + // + // for no atom virial, the order is: + // Identity_15 energy -1, -1, 1 + // Identity_16 energy_derv_c -1, 1, 9 + // Identity_17 energy_derv_r -1, -1, 1, 3 + // Identity_18 energy_redu -1, 1 + // Identity_19 mask (int32) -1, -1 + // + // it seems the order is the alphabet order? + // not sure whether it is safe to assume the order + if (atomic) { + tensor_to_vector(ener_double, retvals[4], status); + tensor_to_vector(force_double, retvals[3], status); + tensor_to_vector(virial_double, retvals[2], status); + tensor_to_vector(atom_energy_double, retvals[0], status); + tensor_to_vector(atom_virial_double, retvals[1], status); + } else { + tensor_to_vector(ener_double, retvals[3], status); + tensor_to_vector(force_double, retvals[2], status); + tensor_to_vector(virial_double, retvals[1], status); + tensor_to_vector(atom_energy_double, retvals[0], status); + } + + // cast back to VALUETYPE + ener = std::vector(ener_double.begin(), ener_double.end()); + force = std::vector(force_double.begin(), force_double.end()); + virial = std::vector(virial_double.begin(), virial_double.end()); + atom_energy = std::vector(atom_energy_double.begin(), + atom_energy_double.end()); + atom_virial = std::vector(atom_virial_double.begin(), + atom_virial_double.end()); + force.resize(static_cast(nframes) * nall_real * 3); + atom_virial.resize(static_cast(nframes) * nall_real * 9); + + // nall atom_energy is required in the C++ API; + // we always forget it! + atom_energy.resize(static_cast(nframes) * nall_real, 0.0); + + force_.resize(static_cast(nframes) * fwd_map.size() * 3); + atom_energy_.resize(static_cast(nframes) * fwd_map.size()); + atom_virial_.resize(static_cast(nframes) * fwd_map.size() * 9); + select_map(force_, force, bkw_map, 3, nframes, fwd_map.size(), + nall_real); + select_map(atom_energy_, atom_energy, bkw_map, 1, nframes, + fwd_map.size(), nall_real); + select_map(atom_virial_, atom_virial, bkw_map, 9, nframes, + fwd_map.size(), nall_real); + + // cleanup input_list, etc + for (size_t i = 0; i < 5; i++) { + TFE_DeleteTensorHandle(input_list[i]); + TF_DeleteTensor(data_tensor[i]); + } + for (size_t i = 0; i < nretvals; i++) { + TFE_DeleteTensorHandle(retvals[i]); + } + TFE_DeleteOp(op); +} + +template +void deepmd::DeepPotJAX::compute(std::vector& ener, + std::vector& force_, + std::vector& virial, + std::vector& atom_energy_, + std::vector& atom_virial_, + const std::vector& dcoord, + const std::vector& datype, + const std::vector& box, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_, + const bool atomic) { + std::vector coord, force, aparam, atom_energy, atom_virial; + std::vector ener_double, force_double, virial_double, + atom_energy_double, atom_virial_double; + std::vector atype, fwd_map, bkw_map; + int nghost_real, nall_real, nloc_real; + int nall = datype.size(); + // nlist passed to the model + int nframes = 1; + + select_real_atoms_coord(coord, atype, aparam, nghost_real, fwd_map, bkw_map, + nall_real, nloc_real, dcoord, datype, aparam_, nghost, + ntypes, nframes, daparam, nall, false); + + if (nloc_real == 0) { + // no real atoms, fill 0 for all outputs + // this can prevent a Xla error + ener.resize(nframes, 0.0); + force_.resize(static_cast(nframes) * nall * 3, 0.0); + virial.resize(static_cast(nframes) * 9, 0.0); + atom_energy_.resize(static_cast(nframes) * nall, 0.0); + atom_virial_.resize(static_cast(nframes) * nall * 9, 0.0); + return; + } + + // cast coord, fparam, and aparam to double - I think it's useless to have a + // float model interface + std::vector coord_double(coord.begin(), coord.end()); + std::vector fparam_double(fparam.begin(), fparam.end()); + std::vector aparam_double(aparam.begin(), aparam.end()); + + if (padding_for_nloc != nloc_real) { + padding_to_nall = nall_real * PADDING_FACTOR; + padding_for_nloc = nloc_real; + } + while (padding_to_nall < nall_real) { + padding_to_nall *= PADDING_FACTOR; + } + // do padding + coord_double.resize(nframes * padding_to_nall * 3, 0.0); + atype.resize(nframes * padding_to_nall, -1); + + TFE_Op* op; + if (atomic) { + op = get_func_op(ctx, "call_lower_with_atomic_virial", func_vector, device, + status); + } else { + op = get_func_op(ctx, "call_lower_without_atomic_virial", func_vector, + device, status); + } + std::vector input_list(6); + std::vector data_tensor(6); + // coord + std::vector coord_shape = {nframes, padding_to_nall, 3}; + input_list[0] = + add_input(op, coord_double, coord_shape, data_tensor[0], status); + // atype + std::vector atype_shape = {nframes, padding_to_nall}; + input_list[1] = add_input(op, atype, atype_shape, data_tensor[1], status); + // nlist + if (ago == 0) { + nlist_data.copy_from_nlist(lmp_list); + nlist_data.shuffle_exclude_empty(fwd_map); + } + size_t max_size = 0; + for (const auto& row : nlist_data.jlist) { + max_size = std::max(max_size, row.size()); + } + std::vector nlist_shape = {nframes, nloc_real, + static_cast(max_size)}; + std::vector nlist(static_cast(nframes) * nloc_real * + max_size); + // pass nlist_data.jlist to nlist + for (int ii = 0; ii < nloc_real; ii++) { + for (int jj = 0; jj < max_size; jj++) { + if (jj < nlist_data.jlist[ii].size()) { + nlist[ii * max_size + jj] = nlist_data.jlist[ii][jj]; + } else { + nlist[ii * max_size + jj] = -1; + } + } + } + input_list[2] = add_input(op, nlist, nlist_shape, data_tensor[2], status); + // mapping; for now, set it to -1, assume it is not used + std::vector mapping_shape = {nframes, padding_to_nall}; + std::vector mapping(nframes * padding_to_nall, -1); + // pass mapping if it is given in the neighbor list + if (lmp_list.mapping) { + // assume nframes is 1 + for (size_t ii = 0; ii < nall_real; ii++) { + mapping[ii] = lmp_list.mapping[fwd_map[ii]]; + } + } + input_list[3] = add_input(op, mapping, mapping_shape, data_tensor[3], status); + // fparam + std::vector fparam_shape = {nframes, dfparam}; + input_list[4] = + add_input(op, fparam_double, fparam_shape, data_tensor[4], status); + // aparam + std::vector aparam_shape = {nframes, nloc_real, daparam}; + input_list[5] = + add_input(op, aparam_double, aparam_shape, data_tensor[5], status); + // execute the function + int nretvals = 6; + TFE_TensorHandle* retvals[nretvals]; + + TFE_Execute(op, retvals, &nretvals, status); + check_status(status); + + // copy data + // the order is: + // energy + // energy_derv_c + // energy_derv_c_redu + // energy_derv_r + // energy_redu + // mask + // it seems the order is the alphabet order? + // not sure whether it is safe to assume the order + tensor_to_vector(ener_double, retvals[4], status); + tensor_to_vector(force_double, retvals[3], status); + tensor_to_vector(virial_double, retvals[2], status); + tensor_to_vector(atom_energy_double, retvals[0], status); + tensor_to_vector(atom_virial_double, retvals[1], status); + + // cast back to VALUETYPE + ener = std::vector(ener_double.begin(), ener_double.end()); + force = std::vector(force_double.begin(), force_double.end()); + virial = std::vector(virial_double.begin(), virial_double.end()); + atom_energy = std::vector(atom_energy_double.begin(), + atom_energy_double.end()); + atom_virial = std::vector(atom_virial_double.begin(), + atom_virial_double.end()); + force.resize(static_cast(nframes) * nall_real * 3); + atom_virial.resize(static_cast(nframes) * nall_real * 9); + + // nall atom_energy is required in the C++ API; + // we always forget it! + atom_energy.resize(static_cast(nframes) * nall_real, 0.0); + + force_.resize(static_cast(nframes) * fwd_map.size() * 3); + atom_energy_.resize(static_cast(nframes) * fwd_map.size()); + atom_virial_.resize(static_cast(nframes) * fwd_map.size() * 9); + select_map(force_, force, bkw_map, 3, nframes, fwd_map.size(), + nall_real); + select_map(atom_energy_, atom_energy, bkw_map, 1, nframes, + fwd_map.size(), nall_real); + select_map(atom_virial_, atom_virial, bkw_map, 9, nframes, + fwd_map.size(), nall_real); + + // cleanup input_list, etc + for (size_t i = 0; i < 6; i++) { + TFE_DeleteTensorHandle(input_list[i]); + TF_DeleteTensor(data_tensor[i]); + } + for (size_t i = 0; i < nretvals; i++) { + TFE_DeleteTensorHandle(retvals[i]); + } + TFE_DeleteOp(op); +} + +template void deepmd::DeepPotJAX::compute( + std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_, + const bool atomic); + +template void deepmd::DeepPotJAX::compute( + std::vector& dener, + std::vector& dforce_, + std::vector& dvirial, + std::vector& datom_energy_, + std::vector& datom_virial_, + const std::vector& dcoord_, + const std::vector& datype_, + const std::vector& dbox, + const int nghost, + const InputNlist& lmp_list, + const int& ago, + const std::vector& fparam, + const std::vector& aparam_, + const bool atomic); + +void deepmd::DeepPotJAX::get_type_map(std::string& type_map_) { + type_map_ = type_map; +} + +// forward to template method +void deepmd::DeepPotJAX::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box, + fparam, aparam, atomic); +} +void deepmd::DeepPotJAX::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box, + fparam, aparam, atomic); +} +void deepmd::DeepPotJAX::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box, + nghost, inlist, ago, fparam, aparam, atomic); +} +void deepmd::DeepPotJAX::computew(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const int nghost, + const InputNlist& inlist, + const int& ago, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + compute(ener, force, virial, atom_energy, atom_virial, coord, atype, box, + nghost, inlist, ago, fparam, aparam, atomic); +} +void deepmd::DeepPotJAX::computew_mixed_type(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + throw deepmd::deepmd_exception("not implemented"); +} +void deepmd::DeepPotJAX::computew_mixed_type(std::vector& ener, + std::vector& force, + std::vector& virial, + std::vector& atom_energy, + std::vector& atom_virial, + const int& nframes, + const std::vector& coord, + const std::vector& atype, + const std::vector& box, + const std::vector& fparam, + const std::vector& aparam, + const bool atomic) { + throw deepmd::deepmd_exception("not implemented"); +} +#endif diff --git a/source/api_cc/tests/test_deeppot_jax.cc b/source/api_cc/tests/test_deeppot_jax.cc new file mode 100644 index 0000000000..439a271015 --- /dev/null +++ b/source/api_cc/tests/test_deeppot_jax.cc @@ -0,0 +1,554 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "DeepPot.h" +#include "neighbor_list.h" +#include "test_utils.h" + +template +class TestInferDeepPotAJAX : public ::testing::Test { + protected: + // import numpy as np + // from deepmd.infer import DeepPot + // coord = np.array([ + // 12.83, 2.56, 2.18, 12.09, 2.87, 2.74, + // 00.25, 3.32, 1.68, 3.36, 3.00, 1.81, + // 3.51, 2.51, 2.60, 4.27, 3.22, 1.56 + // ]).reshape(1, -1) + // atype = np.array([0, 1, 1, 0, 1, 1]) + // box = np.array([13., 0., 0., 0., 13., 0., 0., 0., 13.]).reshape(1, -1) + // dp = DeepPot("deeppot_sea.savedmodel") + // e, f, v, ae, av = dp.eval(coord, box, atype, atomic=True) + // np.set_printoptions(precision=16) + // print(f"{e.ravel()=} {v.ravel()=} {f.ravel()=} {ae.ravel()=} + // {av.ravel()=}") + std::vector coord = {12.83, 2.56, 2.18, 12.09, 2.87, 2.74, + 00.25, 3.32, 1.68, 3.36, 3.00, 1.81, + 3.51, 2.51, 2.60, 4.27, 3.22, 1.56}; + std::vector atype = {0, 1, 1, 0, 1, 1}; + std::vector box = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; + // the data in this file is just copied from PT + std::vector expected_e = { + + -93.016873944029, -185.923296645958, -185.927096544970, + -93.019371018039, -185.926179995548, -185.924351901852}; + std::vector expected_f = { + + 0.006277522211, -0.001117962774, 0.000618580445, 0.009928999655, + 0.003026035654, -0.006941982227, 0.000667853212, -0.002449963843, + 0.006506463508, -0.007284129115, 0.000530662205, -0.000028806821, + 0.000068097781, 0.006121331983, -0.009019754602, -0.009658343745, + -0.006110103225, 0.008865499697}; + std::vector expected_v = { + -0.000155238009, 0.000116605516, -0.007869862476, 0.000465578340, + 0.008182547185, -0.002398713212, -0.008112887338, -0.002423738425, + 0.007210716605, -0.019203504012, 0.001724938709, 0.009909211091, + 0.001153857542, -0.001600015103, -0.000560024090, 0.010727836276, + -0.001034836404, -0.007973454377, -0.021517399106, -0.004064359664, + 0.004866398692, -0.003360038617, -0.007241406162, 0.005920941051, + 0.004899151657, 0.006290788591, -0.006478820311, 0.001921504710, + 0.001313470921, -0.000304091236, 0.001684345981, 0.004124109256, + -0.006396084465, -0.000701095618, -0.006356507032, 0.009818550859, + -0.015230664587, -0.000110244376, 0.000690319396, 0.000045953023, + -0.005726548770, 0.008769818495, -0.000572380210, 0.008860603423, + -0.013819348050, -0.021227082558, -0.004977781343, 0.006646239696, + -0.005987066507, -0.002767831232, 0.003746502525, 0.007697590397, + 0.003746130152, -0.005172634748}; + int natoms; + double expected_tot_e; + std::vector expected_tot_v; + + deepmd::DeepPot dp; + + void SetUp() override { + std::string file_name = "../../tests/infer/deeppot_sea.savedmodel"; + + dp.init(file_name); + + natoms = expected_e.size(); + EXPECT_EQ(natoms * 3, expected_f.size()); + EXPECT_EQ(natoms * 9, expected_v.size()); + expected_tot_e = 0.; + expected_tot_v.resize(9); + std::fill(expected_tot_v.begin(), expected_tot_v.end(), 0.); + for (int ii = 0; ii < natoms; ++ii) { + expected_tot_e += expected_e[ii]; + } + for (int ii = 0; ii < natoms; ++ii) { + for (int dd = 0; dd < 9; ++dd) { + expected_tot_v[dd] += expected_v[ii * 9 + dd]; + } + } + } + + void TearDown() override {} +}; + +TYPED_TEST_SUITE(TestInferDeepPotAJAX, ValueTypes); + +TYPED_TEST(TestInferDeepPotAJAX, cpu_build_nlist) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + double ener; + std::vector force, virial; + dp.compute(ener, force, virial, coord, atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAJAX, cpu_build_nlist_numfv) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + class MyModel : public EnergyModelTest { + deepmd::DeepPot& mydp; + const std::vector atype; + + public: + MyModel(deepmd::DeepPot& dp_, const std::vector& atype_) + : mydp(dp_), atype(atype_) {}; + virtual void compute(double& ener, + std::vector& force, + std::vector& virial, + const std::vector& coord, + const std::vector& box) { + mydp.compute(ener, force, virial, coord, atype, box); + } + }; + MyModel model(dp, atype); + model.test_f(coord, box); + model.test_v(coord, box); + std::vector box_(box); + box_[1] -= 0.4; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[2] += 0.5; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[4] += 0.2; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[3] -= 0.3; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[6] -= 0.7; + model.test_f(coord, box_); + model.test_v(coord, box_); + box_[7] += 0.6; + model.test_f(coord, box_); + model.test_v(coord, box_); +} + +TYPED_TEST(TestInferDeepPotAJAX, cpu_build_nlist_atomic) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + double ener; + std::vector force, virial, atom_ener, atom_vir; + dp.compute(ener, force, virial, atom_ener, atom_vir, coord, atype, box); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + EXPECT_EQ(atom_ener.size(), natoms); + EXPECT_EQ(atom_vir.size(), natoms * 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAJAX, cpu_lmp_nlist) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + double ener; + std::vector force_, virial; + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 0); + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + + ener = 0.; + std::fill(force_.begin(), force_.end(), 0.0); + std::fill(virial.begin(), virial.end(), 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 1); + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAJAX, cpu_lmp_nlist_atomic) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + double ener; + std::vector force_, atom_ener_, atom_vir_, virial; + std::vector force, atom_ener, atom_vir; + dp.compute(ener, force_, virial, atom_ener_, atom_vir_, coord_cpy, atype_cpy, + box, nall - nloc, inlist, 0); + _fold_back(force, force_, mapping, nloc, nall, 3); + _fold_back(atom_ener, atom_ener_, mapping, nloc, nall, 1); + _fold_back(atom_vir, atom_vir_, mapping, nloc, nall, 9); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + EXPECT_EQ(atom_ener.size(), natoms); + EXPECT_EQ(atom_vir.size(), natoms * 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_v[ii]), EPSILON); + } + + ener = 0.; + std::fill(force_.begin(), force_.end(), 0.0); + std::fill(virial.begin(), virial.end(), 0.0); + std::fill(atom_ener_.begin(), atom_ener_.end(), 0.0); + std::fill(atom_vir_.begin(), atom_vir_.end(), 0.0); + dp.compute(ener, force_, virial, atom_ener_, atom_vir_, coord_cpy, atype_cpy, + box, nall - nloc, inlist, 1); + _fold_back(force, force_, mapping, nloc, nall, 3); + _fold_back(atom_ener, atom_ener_, mapping, nloc, nall, 1); + _fold_back(atom_vir, atom_vir_, mapping, nloc, nall, 9); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + EXPECT_EQ(atom_ener.size(), natoms); + EXPECT_EQ(atom_vir.size(), natoms * 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + for (int ii = 0; ii < natoms; ++ii) { + EXPECT_LT(fabs(atom_ener[ii] - expected_e[ii]), EPSILON); + } + for (int ii = 0; ii < natoms * 9; ++ii) { + EXPECT_LT(fabs(atom_vir[ii] - expected_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAJAX, cpu_lmp_nlist_2rc) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc * 2); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + double ener; + std::vector force_(nall * 3, 0.0), virial(9, 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 0); + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } + + ener = 0.; + std::fill(force_.begin(), force_.end(), 0.0); + std::fill(virial.begin(), virial.end(), 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 1); + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAJAX, cpu_lmp_nlist_type_sel) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + + // add vir atoms + int nvir = 2; + std::vector coord_vir(nvir * 3); + std::vector atype_vir(nvir, 2); + for (int ii = 0; ii < nvir; ++ii) { + coord_vir[ii] = coord[ii]; + } + coord.insert(coord.begin(), coord_vir.begin(), coord_vir.end()); + atype.insert(atype.begin(), atype_vir.begin(), atype_vir.end()); + natoms += nvir; + std::vector expected_f_vir(nvir * 3, 0.0); + expected_f.insert(expected_f.begin(), expected_f_vir.begin(), + expected_f_vir.end()); + + // build nlist + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + // dp compute + double ener; + std::vector force_(nall * 3, 0.0), virial(9, 0.0); + dp.compute(ener, force_, virial, coord_cpy, atype_cpy, box, nall - nloc, + inlist, 0); + // fold back + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAJAX, cpu_lmp_nlist_type_sel_atomic) { + using VALUETYPE = TypeParam; + std::vector& coord = this->coord; + std::vector& atype = this->atype; + std::vector& box = this->box; + std::vector& expected_e = this->expected_e; + std::vector& expected_f = this->expected_f; + std::vector& expected_v = this->expected_v; + int& natoms = this->natoms; + double& expected_tot_e = this->expected_tot_e; + std::vector& expected_tot_v = this->expected_tot_v; + deepmd::DeepPot& dp = this->dp; + float rc = dp.cutoff(); + + // add vir atoms + int nvir = 2; + std::vector coord_vir(nvir * 3); + std::vector atype_vir(nvir, 2); + for (int ii = 0; ii < nvir; ++ii) { + coord_vir[ii] = coord[ii]; + } + coord.insert(coord.begin(), coord_vir.begin(), coord_vir.end()); + atype.insert(atype.begin(), atype_vir.begin(), atype_vir.end()); + natoms += nvir; + std::vector expected_f_vir(nvir * 3, 0.0); + expected_f.insert(expected_f.begin(), expected_f_vir.begin(), + expected_f_vir.end()); + + // build nlist + int nloc = coord.size() / 3; + std::vector coord_cpy; + std::vector atype_cpy, mapping; + std::vector > nlist_data; + _build_nlist(nlist_data, coord_cpy, atype_cpy, mapping, coord, + atype, box, rc); + int nall = coord_cpy.size() / 3; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_data); + + // dp compute + double ener; + std::vector force_(nall * 3, 0.0), virial(9, 0.0), atomic_energy, + atomic_virial; + dp.compute(ener, force_, virial, atomic_energy, atomic_virial, coord_cpy, + atype_cpy, box, nall - nloc, inlist, 0); + // fold back + std::vector force; + _fold_back(force, force_, mapping, nloc, nall, 3); + + EXPECT_EQ(force.size(), natoms * 3); + EXPECT_EQ(virial.size(), 9); + + EXPECT_LT(fabs(ener - expected_tot_e), EPSILON); + for (int ii = 0; ii < natoms * 3; ++ii) { + EXPECT_LT(fabs(force[ii] - expected_f[ii]), EPSILON); + } + for (int ii = 0; ii < 3 * 3; ++ii) { + EXPECT_LT(fabs(virial[ii] - expected_tot_v[ii]), EPSILON); + } +} + +TYPED_TEST(TestInferDeepPotAJAX, print_summary) { + deepmd::DeepPot& dp = this->dp; + dp.print_summary(""); +} + +TYPED_TEST(TestInferDeepPotAJAX, get_type_map) { + deepmd::DeepPot& dp = this->dp; + std::string type_map; + dp.get_type_map(type_map); + EXPECT_EQ(type_map, "O H"); +} diff --git a/source/cmake/googletest.cmake.in b/source/cmake/googletest.cmake.in index 5d167cf774..85c3745c00 100644 --- a/source/cmake/googletest.cmake.in +++ b/source/cmake/googletest.cmake.in @@ -11,7 +11,7 @@ endif() include(ExternalProject) ExternalProject_Add(googletest GIT_REPOSITORY ${GTEST_REPO_ADDRESS} - GIT_TAG release-1.12.1 + GIT_TAG v1.14.0 GIT_SHALLOW TRUE SOURCE_DIR "@CMAKE_CURRENT_BINARY_DIR@/googletest-src" BINARY_DIR "@CMAKE_CURRENT_BINARY_DIR@/googletest-build" diff --git a/source/lib/include/neighbor_list.h b/source/lib/include/neighbor_list.h index bb4b8cf13c..5b39ea7454 100644 --- a/source/lib/include/neighbor_list.h +++ b/source/lib/include/neighbor_list.h @@ -44,6 +44,8 @@ struct InputNlist { void* world; /// mask to the neighbor index int mask = 0xFFFFFFFF; + /// mapping from all atoms to real atoms, in the size of nall + int* mapping = nullptr; InputNlist() : inum(0), ilist(NULL), @@ -99,6 +101,10 @@ struct InputNlist { * @brief Set mask for this neighbor list. */ void set_mask(int mask_) { mask = mask_; }; + /** + * @brief Set mapping for this neighbor list. + */ + void set_mapping(int* mapping_) { mapping = mapping_; }; }; /** diff --git a/source/lmp/fix_dplr.cpp b/source/lmp/fix_dplr.cpp index 8e54410d0a..ac161730db 100644 --- a/source/lmp/fix_dplr.cpp +++ b/source/lmp/fix_dplr.cpp @@ -467,6 +467,14 @@ void FixDPLR::pre_force(int vflag) { int nghost = atom->nghost; int nall = nlocal + nghost; + // mapping (for DPA-2 JAX) + std::vector mapping_vec(nall, -1); + if (comm->nprocs == 1 && atom->map_style != Atom::MAP_NONE) { + for (size_t ii = 0; ii < nall; ++ii) { + mapping_vec[ii] = atom->map(atom->tag[ii]); + } + } + // if (eflag_atom) { // error->all(FLERR,"atomic energy calculation is not supported by this // fix\n"); @@ -499,6 +507,9 @@ void FixDPLR::pre_force(int vflag) { deepmd_compat::InputNlist lmp_list(list->inum, list->ilist, list->numneigh, list->firstneigh); lmp_list.set_mask(NEIGHMASK); + if (comm->nprocs == 1 && atom->map_style != Atom::MAP_NONE) { + lmp_list.set_mapping(mapping_vec.data()); + } // declear output vector tensor; // compute diff --git a/source/lmp/pair_deepmd.cpp b/source/lmp/pair_deepmd.cpp index 6d12fda20a..8127979cd1 100644 --- a/source/lmp/pair_deepmd.cpp +++ b/source/lmp/pair_deepmd.cpp @@ -155,6 +155,14 @@ void PairDeepMD::compute(int eflag, int vflag) { } } + // mapping (for DPA-2 JAX) + std::vector mapping_vec(nall, -1); + if (comm->nprocs == 1 && atom->map_style != Atom::MAP_NONE) { + for (size_t ii = 0; ii < nall; ++ii) { + mapping_vec[ii] = atom->map(atom->tag[ii]); + } + } + if (do_compute_aparam) { make_aparam_from_compute(daparam); } else if (aparam.size() > 0) { @@ -198,6 +206,9 @@ void PairDeepMD::compute(int eflag, int vflag) { commdata_->firstrecv, commdata_->sendlist, commdata_->sendproc, commdata_->recvproc, &world); lmp_list.set_mask(NEIGHMASK); + if (comm->nprocs == 1 && atom->map_style != Atom::MAP_NONE) { + lmp_list.set_mapping(mapping_vec.data()); + } deepmd_compat::InputNlist extend_lmp_list; if (single_model || multi_models_no_mod_devi) { // cvflag_atom is the right flag for the cvatom matrix diff --git a/source/lmp/tests/test_lammps_dpa_jax.py b/source/lmp/tests/test_lammps_dpa_jax.py new file mode 100644 index 0000000000..10428b2374 --- /dev/null +++ b/source/lmp/tests/test_lammps_dpa_jax.py @@ -0,0 +1,726 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +import importlib +import os +import shutil +import subprocess as sp +import sys +import tempfile +from pathlib import ( + Path, +) + +import constants +import numpy as np +import pytest +from lammps import ( + PyLammps, +) +from write_lmp_data import ( + write_lmp_data, +) + +pbtxt_file2 = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot-1.pbtxt" +) +pb_file = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot_dpa.savedmodel" +) +pb_file2 = Path(__file__).parent / "graph2.pb" +system_file = Path(__file__).parent.parent.parent / "tests" +data_file = Path(__file__).parent / "data.lmp" +data_file_si = Path(__file__).parent / "data.si" +data_type_map_file = Path(__file__).parent / "data_type_map.lmp" +md_file = Path(__file__).parent / "md.out" + +# this is as the same as python and c++ tests, test_deeppot_a.py +expected_ae = np.array( + [ + -94.24098099691867, + -187.8049502787117, + -187.80486052083617, + -94.24059525229518, + -187.80366985846246, + -187.8042377490619, + ] +) +expected_e = np.sum(expected_ae) +expected_f = np.array( + [ + -0.0020150115442053, + -0.0133389255924977, + -0.0014347177433057, + -0.0140757358179293, + 0.0031373814221557, + 0.0098594354314677, + 0.004755683505073, + 0.0099471082374397, + -0.0080868184532793, + -0.0086166721574536, + 0.0037803939137322, + -0.0075733131286482, + 0.0037437603038209, + -0.008452527996008, + 0.0134837461840424, + 0.0162079757106944, + 0.0049265700151781, + -0.0062483322902769, + ] +).reshape(6, 3) + +expected_f2 = np.array( + [ + [-0.6454949, 1.72457783, 0.18897958], + [1.68936514, -0.36995299, -1.36044464], + [-1.09902692, -1.35487928, 1.17416702], + [1.68426111, -0.50835585, 0.98340415], + [0.05771758, 1.12515818, -1.77561531], + [-1.686822, -0.61654789, 0.78950921], + ] +) + +expected_v = -np.array( + [ + 0.0133534319524089, + 0.0013445914938337, + -0.0029370551651952, + 0.0002611806151294, + 0.004662662211533, + -0.0002717443796319, + -0.0027779798869954, + -0.0003277976466339, + 0.0018284972283065, + 0.0085710118978246, + 0.0003865036653608, + -0.0057964032875089, + -0.0014358330222619, + 0.0002912625128908, + 0.001212630641674, + -0.0050582608957046, + -0.0001087907763249, + 0.0040068757134429, + 0.0116736349373084, + 0.0007055477968445, + -0.0019544933708784, + 0.0032997459258512, + 0.0037887116116712, + -0.0043140890650835, + -0.0034418738401156, + -0.0029420616852742, + 0.0038219676716965, + 0.0147134944025738, + 0.0005214313829998, + -0.0006524136175906, + 0.0003656980996363, + 0.0010046161607714, + -0.0017279359476254, + 0.000111127036911, + -0.0017063190420654, + 0.0030174567965904, + 0.0104435705455108, + -0.0008704394438241, + 0.0012354202650812, + 0.0009397615830053, + 0.0029105236407293, + -0.0044188897903449, + -0.0011461513500477, + -0.0045759080125852, + 0.0070310883421107, + 0.0089818851995049, + 0.0038819466696704, + -0.005443705549253, + 0.0025390283635246, + 0.0012121502955869, + -0.0016998728971157, + -0.0032355117893925, + -0.0015590242752438, + 0.0021980725909838, + ] +).reshape(6, 9) +expected_v2 = -np.array( + [ + [ + -0.70008436, + -0.06399891, + 0.63678391, + -0.07642171, + -0.70580035, + 0.20506145, + 0.64098364, + 0.20305781, + -0.57906794, + ], + [ + -0.6372635, + 0.14315552, + 0.51952246, + 0.04604049, + -0.06003681, + -0.02688702, + 0.54489318, + -0.10951559, + -0.43730539, + ], + [ + -0.25090748, + -0.37466262, + 0.34085833, + -0.26690852, + -0.37676917, + 0.29080825, + 0.31600481, + 0.37558276, + -0.33251064, + ], + [ + -0.80195614, + -0.10273138, + 0.06935364, + -0.10429256, + -0.29693811, + 0.45643496, + 0.07247872, + 0.45604679, + -0.71048816, + ], + [ + -0.03840668, + -0.07680205, + 0.10940472, + -0.02374189, + -0.27610266, + 0.4336071, + 0.02465248, + 0.4290638, + -0.67496763, + ], + [ + -0.61475065, + -0.21163135, + 0.26652929, + -0.26134659, + -0.11560267, + 0.15415902, + 0.34343952, + 0.1589482, + -0.21370642, + ], + ] +).reshape(6, 9) + +box = np.array([0, 13, 0, 13, 0, 13, 0, 0, 0]) +coord = np.array( + [ + [12.83, 2.56, 2.18], + [12.09, 2.87, 2.74], + [0.25, 3.32, 1.68], + [3.36, 3.00, 1.81], + [3.51, 2.51, 2.60], + [4.27, 3.22, 1.56], + ] +) +type_OH = np.array([1, 2, 2, 1, 2, 2]) +type_HO = np.array([2, 1, 1, 2, 1, 1]) + + +sp.check_output( + f"{sys.executable} -m deepmd convert-from pbtxt -i {pbtxt_file2.resolve()} -o {pb_file2.resolve()}".split() +) + + +def setup_module(): + write_lmp_data(box, coord, type_OH, data_file) + write_lmp_data(box, coord, type_HO, data_type_map_file) + write_lmp_data( + box * constants.dist_metal2si, + coord * constants.dist_metal2si, + type_OH, + data_file_si, + ) + + +def teardown_module(): + os.remove(data_file) + os.remove(data_type_map_file) + + +def _lammps(data_file, units="metal") -> PyLammps: + lammps = PyLammps() + lammps.units(units) + lammps.boundary("p p p") + lammps.atom_style("atomic") + # Requires for DPA-2 + lammps.atom_modify("map yes") + if units == "metal" or units == "real": + lammps.neighbor("2.0 bin") + elif units == "si": + lammps.neighbor("2.0e-10 bin") + else: + raise ValueError("units should be metal, real, or si") + lammps.neigh_modify("every 10 delay 0 check no") + lammps.read_data(data_file.resolve()) + if units == "metal" or units == "real": + lammps.mass("1 16") + lammps.mass("2 2") + elif units == "si": + lammps.mass("1 %.10e" % (16 * constants.mass_metal2si)) + lammps.mass("2 %.10e" % (2 * constants.mass_metal2si)) + else: + raise ValueError("units should be metal, real, or si") + if units == "metal": + lammps.timestep(0.0005) + elif units == "real": + lammps.timestep(0.5) + elif units == "si": + lammps.timestep(5e-16) + else: + raise ValueError("units should be metal, real, or si") + lammps.fix("1 all nve") + return lammps + + +@pytest.fixture +def lammps(): + lmp = _lammps(data_file=data_file) + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_type_map(): + lmp = _lammps(data_file=data_type_map_file) + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_real(): + lmp = _lammps(data_file=data_file, units="real") + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_si(): + lmp = _lammps(data_file=data_file_si, units="si") + yield lmp + lmp.close() + + +def test_pair_deepmd(lammps): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + lammps.run(1) + + +def test_pair_deepmd_virial(lammps): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + idx_map = lammps.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps.variables[f"virial{ii}"].value + ) / constants.nktv2p == pytest.approx(expected_v[idx_map, ii]) + + +def test_pair_deepmd_model_devi(lammps): + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_virial(lammps): + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps.pair_coeff("* *") + lammps.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + idx_map = lammps.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps.variables[f"virial{ii}"].value + ) / constants.nktv2p == pytest.approx(expected_v[idx_map, ii]) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_atomic_relative(lammps): + relative = 1.0 + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative {relative}" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_atomic_relative_v(lammps): + relative = 1.0 + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative_v {relative}" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + norm = ( + np.abs( + np.mean([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) + ) + / 6 + ) + expected_md_v /= norm + relative + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_type_map(lammps_type_map): + lammps_type_map.pair_style(f"deepmd {pb_file.resolve()}") + lammps_type_map.pair_coeff("* * H O") + lammps_type_map.run(0) + assert lammps_type_map.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps_type_map.atoms[ii].force == pytest.approx( + expected_f[lammps_type_map.atoms[ii].id - 1] + ) + lammps_type_map.run(1) + + +def test_pair_deepmd_real(lammps_real): + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + lammps_real.run(1) + + +def test_pair_deepmd_virial_real(lammps_real): + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps_real.variables[f"virial{ii}"].value + ) / constants.nktv2p_real == pytest.approx( + expected_v[idx_map, ii] * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_real(lammps_real): + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_virial_real(lammps_real): + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps_real.variables[f"virial{ii}"].value + ) / constants.nktv2p_real == pytest.approx( + expected_v[idx_map, ii] * constants.ener_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_atomic_relative_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative {relative * constants.force_metal2real}" + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_atomic_relative_v_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative_v {relative * constants.ener_metal2real}" + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + norm = ( + np.abs( + np.mean([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) + ) + / 6 + ) + expected_md_v /= norm + relative + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_si(lammps_si): + lammps_si.pair_style(f"deepmd {pb_file.resolve()}") + lammps_si.pair_coeff("* *") + lammps_si.run(0) + assert lammps_si.eval("pe") == pytest.approx(expected_e * constants.ener_metal2si) + for ii in range(6): + assert lammps_si.atoms[ii].force == pytest.approx( + expected_f[lammps_si.atoms[ii].id - 1] * constants.force_metal2si + ) + lammps_si.run(1) + + +@pytest.mark.skipif( + shutil.which("mpirun") is None, reason="MPI is not installed on this system" +) +@pytest.mark.skipif( + importlib.util.find_spec("mpi4py") is None, reason="mpi4py is not installed" +) +@pytest.mark.parametrize( + ("balance_args",), + [(["--balance"],), ([],)], +) +@pytest.mark.skip("MPI is not supported") +def test_pair_deepmd_mpi(balance_args: list): + with tempfile.NamedTemporaryFile() as f: + sp.check_call( + [ + "mpirun", + "-n", + "2", + sys.executable, + Path(__file__).parent / "run_mpi_pair_deepmd.py", + data_file, + pb_file, + pb_file2, + md_file, + f.name, + *balance_args, + ] + ) + arr = np.loadtxt(f.name, ndmin=1) + pe = arr[0] + + relative = 1.0 + assert pe == pytest.approx(expected_e) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) diff --git a/source/lmp/tests/test_lammps_jax.py b/source/lmp/tests/test_lammps_jax.py new file mode 100644 index 0000000000..6d67cd3203 --- /dev/null +++ b/source/lmp/tests/test_lammps_jax.py @@ -0,0 +1,723 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later +import importlib +import os +import shutil +import subprocess as sp +import sys +import tempfile +from pathlib import ( + Path, +) + +import constants +import numpy as np +import pytest +from lammps import ( + PyLammps, +) +from write_lmp_data import ( + write_lmp_data, +) + +pbtxt_file2 = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot-1.pbtxt" +) +pb_file = ( + Path(__file__).parent.parent.parent / "tests" / "infer" / "deeppot_sea.savedmodel" +) +pb_file2 = Path(__file__).parent / "graph2.pb" +system_file = Path(__file__).parent.parent.parent / "tests" +data_file = Path(__file__).parent / "data.lmp" +data_file_si = Path(__file__).parent / "data.si" +data_type_map_file = Path(__file__).parent / "data_type_map.lmp" +md_file = Path(__file__).parent / "md.out" + +# this is as the same as python and c++ tests, test_deeppot_a.py +expected_ae = np.array( + [ + -93.016873944029, + -185.923296645958, + -185.927096544970, + -93.019371018039, + -185.926179995548, + -185.924351901852, + ] +) +expected_e = np.sum(expected_ae) +expected_f = np.array( + [ + 0.006277522211, + -0.001117962774, + 0.000618580445, + 0.009928999655, + 0.003026035654, + -0.006941982227, + 0.000667853212, + -0.002449963843, + 0.006506463508, + -0.007284129115, + 0.000530662205, + -0.000028806821, + 0.000068097781, + 0.006121331983, + -0.009019754602, + -0.009658343745, + -0.006110103225, + 0.008865499697, + ] +).reshape(6, 3) + +expected_f2 = np.array( + [ + [-0.6454949, 1.72457783, 0.18897958], + [1.68936514, -0.36995299, -1.36044464], + [-1.09902692, -1.35487928, 1.17416702], + [1.68426111, -0.50835585, 0.98340415], + [0.05771758, 1.12515818, -1.77561531], + [-1.686822, -0.61654789, 0.78950921], + ] +) + +expected_v = -np.array( + [ + -0.000155238009, + 0.000116605516, + -0.007869862476, + 0.000465578340, + 0.008182547185, + -0.002398713212, + -0.008112887338, + -0.002423738425, + 0.007210716605, + -0.019203504012, + 0.001724938709, + 0.009909211091, + 0.001153857542, + -0.001600015103, + -0.000560024090, + 0.010727836276, + -0.001034836404, + -0.007973454377, + -0.021517399106, + -0.004064359664, + 0.004866398692, + -0.003360038617, + -0.007241406162, + 0.005920941051, + 0.004899151657, + 0.006290788591, + -0.006478820311, + 0.001921504710, + 0.001313470921, + -0.000304091236, + 0.001684345981, + 0.004124109256, + -0.006396084465, + -0.000701095618, + -0.006356507032, + 0.009818550859, + -0.015230664587, + -0.000110244376, + 0.000690319396, + 0.000045953023, + -0.005726548770, + 0.008769818495, + -0.000572380210, + 0.008860603423, + -0.013819348050, + -0.021227082558, + -0.004977781343, + 0.006646239696, + -0.005987066507, + -0.002767831232, + 0.003746502525, + 0.007697590397, + 0.003746130152, + -0.005172634748, + ] +).reshape(6, 9) +expected_v2 = -np.array( + [ + [ + -0.70008436, + -0.06399891, + 0.63678391, + -0.07642171, + -0.70580035, + 0.20506145, + 0.64098364, + 0.20305781, + -0.57906794, + ], + [ + -0.6372635, + 0.14315552, + 0.51952246, + 0.04604049, + -0.06003681, + -0.02688702, + 0.54489318, + -0.10951559, + -0.43730539, + ], + [ + -0.25090748, + -0.37466262, + 0.34085833, + -0.26690852, + -0.37676917, + 0.29080825, + 0.31600481, + 0.37558276, + -0.33251064, + ], + [ + -0.80195614, + -0.10273138, + 0.06935364, + -0.10429256, + -0.29693811, + 0.45643496, + 0.07247872, + 0.45604679, + -0.71048816, + ], + [ + -0.03840668, + -0.07680205, + 0.10940472, + -0.02374189, + -0.27610266, + 0.4336071, + 0.02465248, + 0.4290638, + -0.67496763, + ], + [ + -0.61475065, + -0.21163135, + 0.26652929, + -0.26134659, + -0.11560267, + 0.15415902, + 0.34343952, + 0.1589482, + -0.21370642, + ], + ] +).reshape(6, 9) + +box = np.array([0, 13, 0, 13, 0, 13, 0, 0, 0]) +coord = np.array( + [ + [12.83, 2.56, 2.18], + [12.09, 2.87, 2.74], + [0.25, 3.32, 1.68], + [3.36, 3.00, 1.81], + [3.51, 2.51, 2.60], + [4.27, 3.22, 1.56], + ] +) +type_OH = np.array([1, 2, 2, 1, 2, 2]) +type_HO = np.array([2, 1, 1, 2, 1, 1]) + + +sp.check_output( + f"{sys.executable} -m deepmd convert-from pbtxt -i {pbtxt_file2.resolve()} -o {pb_file2.resolve()}".split() +) + + +def setup_module(): + write_lmp_data(box, coord, type_OH, data_file) + write_lmp_data(box, coord, type_HO, data_type_map_file) + write_lmp_data( + box * constants.dist_metal2si, + coord * constants.dist_metal2si, + type_OH, + data_file_si, + ) + + +def teardown_module(): + os.remove(data_file) + os.remove(data_type_map_file) + + +def _lammps(data_file, units="metal") -> PyLammps: + lammps = PyLammps() + lammps.units(units) + lammps.boundary("p p p") + lammps.atom_style("atomic") + if units == "metal" or units == "real": + lammps.neighbor("2.0 bin") + elif units == "si": + lammps.neighbor("2.0e-10 bin") + else: + raise ValueError("units should be metal, real, or si") + lammps.neigh_modify("every 10 delay 0 check no") + lammps.read_data(data_file.resolve()) + if units == "metal" or units == "real": + lammps.mass("1 16") + lammps.mass("2 2") + elif units == "si": + lammps.mass("1 %.10e" % (16 * constants.mass_metal2si)) + lammps.mass("2 %.10e" % (2 * constants.mass_metal2si)) + else: + raise ValueError("units should be metal, real, or si") + if units == "metal": + lammps.timestep(0.0005) + elif units == "real": + lammps.timestep(0.5) + elif units == "si": + lammps.timestep(5e-16) + else: + raise ValueError("units should be metal, real, or si") + lammps.fix("1 all nve") + return lammps + + +@pytest.fixture +def lammps(): + lmp = _lammps(data_file=data_file) + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_type_map(): + lmp = _lammps(data_file=data_type_map_file) + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_real(): + lmp = _lammps(data_file=data_file, units="real") + yield lmp + lmp.close() + + +@pytest.fixture +def lammps_si(): + lmp = _lammps(data_file=data_file_si, units="si") + yield lmp + lmp.close() + + +def test_pair_deepmd(lammps): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + lammps.run(1) + + +def test_pair_deepmd_virial(lammps): + lammps.pair_style(f"deepmd {pb_file.resolve()}") + lammps.pair_coeff("* *") + lammps.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + idx_map = lammps.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps.variables[f"virial{ii}"].value + ) / constants.nktv2p == pytest.approx(expected_v[idx_map, ii]) + + +def test_pair_deepmd_model_devi(lammps): + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_virial(lammps): + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps.pair_coeff("* *") + lammps.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + idx_map = lammps.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps.variables[f"virial{ii}"].value + ) / constants.nktv2p == pytest.approx(expected_v[idx_map, ii]) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_atomic_relative(lammps): + relative = 1.0 + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative {relative}" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_model_devi_atomic_relative_v(lammps): + relative = 1.0 + lammps.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative_v {relative}" + ) + lammps.pair_coeff("* *") + lammps.run(0) + assert lammps.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps.atoms[ii].force == pytest.approx( + expected_f[lammps.atoms[ii].id - 1] + ) + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + norm = ( + np.abs( + np.mean([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) + ) + / 6 + ) + expected_md_v /= norm + relative + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) + + +def test_pair_deepmd_type_map(lammps_type_map): + lammps_type_map.pair_style(f"deepmd {pb_file.resolve()}") + lammps_type_map.pair_coeff("* * H O") + lammps_type_map.run(0) + assert lammps_type_map.eval("pe") == pytest.approx(expected_e) + for ii in range(6): + assert lammps_type_map.atoms[ii].force == pytest.approx( + expected_f[lammps_type_map.atoms[ii].id - 1] + ) + lammps_type_map.run(1) + + +def test_pair_deepmd_real(lammps_real): + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + lammps_real.run(1) + + +def test_pair_deepmd_virial_real(lammps_real): + lammps_real.pair_style(f"deepmd {pb_file.resolve()}") + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps_real.variables[f"virial{ii}"].value + ) / constants.nktv2p_real == pytest.approx( + expected_v[idx_map, ii] * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_real(lammps_real): + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_virial_real(lammps_real): + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic" + ) + lammps_real.pair_coeff("* *") + lammps_real.compute("virial all centroid/stress/atom NULL pair") + for ii in range(9): + jj = [0, 4, 8, 3, 6, 7, 1, 2, 5][ii] + lammps_real.variable(f"virial{jj} atom c_virial[{ii+1}]") + lammps_real.dump( + "1 all custom 1 dump id " + " ".join([f"v_virial{ii}" for ii in range(9)]) + ) + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + idx_map = lammps_real.lmp.numpy.extract_atom("id") - 1 + for ii in range(9): + assert np.array( + lammps_real.variables[f"virial{ii}"].value + ) / constants.nktv2p_real == pytest.approx( + expected_v[idx_map, ii] * constants.ener_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_atomic_relative_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative {relative * constants.force_metal2real}" + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_model_devi_atomic_relative_v_real(lammps_real): + relative = 1.0 + lammps_real.pair_style( + f"deepmd {pb_file.resolve()} {pb_file2.resolve()} out_file {md_file.resolve()} out_freq 1 atomic relative_v {relative * constants.ener_metal2real}" + ) + lammps_real.pair_coeff("* *") + lammps_real.run(0) + assert lammps_real.eval("pe") == pytest.approx( + expected_e * constants.ener_metal2real + ) + for ii in range(6): + assert lammps_real.atoms[ii].force == pytest.approx( + expected_f[lammps_real.atoms[ii].id - 1] * constants.force_metal2real + ) + md = np.loadtxt(md_file.resolve()) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + assert md[7:] == pytest.approx(expected_md_f * constants.force_metal2real) + assert md[4] == pytest.approx(np.max(expected_md_f) * constants.force_metal2real) + assert md[5] == pytest.approx(np.min(expected_md_f) * constants.force_metal2real) + assert md[6] == pytest.approx(np.mean(expected_md_f) * constants.force_metal2real) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + norm = ( + np.abs( + np.mean([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) + ) + / 6 + ) + expected_md_v /= norm + relative + assert md[1] == pytest.approx(np.max(expected_md_v) * constants.ener_metal2real) + assert md[2] == pytest.approx(np.min(expected_md_v) * constants.ener_metal2real) + assert md[3] == pytest.approx( + np.sqrt(np.mean(np.square(expected_md_v))) * constants.ener_metal2real + ) + + +def test_pair_deepmd_si(lammps_si): + lammps_si.pair_style(f"deepmd {pb_file.resolve()}") + lammps_si.pair_coeff("* *") + lammps_si.run(0) + assert lammps_si.eval("pe") == pytest.approx(expected_e * constants.ener_metal2si) + for ii in range(6): + assert lammps_si.atoms[ii].force == pytest.approx( + expected_f[lammps_si.atoms[ii].id - 1] * constants.force_metal2si + ) + lammps_si.run(1) + + +@pytest.mark.skipif( + shutil.which("mpirun") is None, reason="MPI is not installed on this system" +) +@pytest.mark.skipif( + importlib.util.find_spec("mpi4py") is None, reason="mpi4py is not installed" +) +@pytest.mark.parametrize( + ("balance_args",), + [(["--balance"],), ([],)], +) +def test_pair_deepmd_mpi(balance_args: list): + with tempfile.NamedTemporaryFile() as f: + sp.check_call( + [ + "mpirun", + "-n", + "2", + sys.executable, + Path(__file__).parent / "run_mpi_pair_deepmd.py", + data_file, + pb_file, + pb_file2, + md_file, + f.name, + *balance_args, + ] + ) + arr = np.loadtxt(f.name, ndmin=1) + pe = arr[0] + + relative = 1.0 + assert pe == pytest.approx(expected_e) + # load model devi + md = np.loadtxt(md_file.resolve()) + norm = np.linalg.norm(np.mean([expected_f, expected_f2], axis=0), axis=1) + expected_md_f = np.linalg.norm(np.std([expected_f, expected_f2], axis=0), axis=1) + expected_md_f /= norm + relative + assert md[7:] == pytest.approx(expected_md_f) + assert md[4] == pytest.approx(np.max(expected_md_f)) + assert md[5] == pytest.approx(np.min(expected_md_f)) + assert md[6] == pytest.approx(np.mean(expected_md_f)) + expected_md_v = ( + np.std([np.sum(expected_v, axis=0), np.sum(expected_v2, axis=0)], axis=0) / 6 + ) + assert md[1] == pytest.approx(np.max(expected_md_v)) + assert md[2] == pytest.approx(np.min(expected_md_v)) + assert md[3] == pytest.approx(np.sqrt(np.mean(np.square(expected_md_v)))) diff --git a/source/tests/infer/convert-models.sh b/source/tests/infer/convert-models.sh new file mode 100755 index 0000000000..d74023b9fd --- /dev/null +++ b/source/tests/infer/convert-models.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -ev + +SCRIPT_PATH=$(dirname $(realpath -s $0)) + +dp convert-backend ${SCRIPT_PATH}/deeppot_sea.yaml ${SCRIPT_PATH}/deeppot_sea.savedmodel +dp convert-backend ${SCRIPT_PATH}/deeppot_dpa.yaml ${SCRIPT_PATH}/deeppot_dpa.savedmodel diff --git a/source/tests/infer/deeppot_dpa.yaml b/source/tests/infer/deeppot_dpa.yaml new file mode 100644 index 0000000000..29cf7c7b5d --- /dev/null +++ b/source/tests/infer/deeppot_dpa.yaml @@ -0,0 +1,5520 @@ +"@variables": {} +backend: PyTorch +model: + "@class": Model + "@variables": + out_bias: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - -93.57372029622395 + - - -187.1474405924479 + out_std: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - - 1.0 + "@version": 2 + atom_exclude_types: [] + descriptor: + "@class": Descriptor + "@version": 3 + add_tebd_to_repinit_out: false + concat_output_tebd: true + env_protection: 0.0 + exclude_types: [] + g1_shape_tranform: + "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.20483269303791724 + - -0.21992468328757978 + - -0.26684291550680395 + - 0.37176791042370194 + - 0.012112465815266748 + - - -0.10228811869581654 + - 0.08533578921915844 + - -0.3127677683059358 + - 0.032891262984076214 + - 0.23853603507174417 + - - -0.11012778988715048 + - 0.002332609590948461 + - 0.1086418697477636 + - -0.1658026622411995 + - -0.21664326015096075 + - - -0.3527700628717402 + - -0.0075194560495788045 + - 0.18179527579497576 + - -0.003956996745727664 + - 0.1718867759576585 + - - 0.0690111857182912 + - 0.12422934001100412 + - 0.2162151055573501 + - -0.24322535261890577 + - -0.029043758026887957 + - - 0.34780578564256326 + - 0.20364573090748753 + - -0.05444165068567216 + - 0.030228628305679458 + - -0.36336997419904504 + - - -0.20379881010311193 + - -0.2128475427919148 + - -0.037252887701215716 + - -0.23563042001690995 + - 0.038193025137633965 + - - 0.11171587196232823 + - 0.1670429227878146 + - -0.1463146137690288 + - 0.33725869994865676 + - -0.251623438391177 + - - -0.3906697623605178 + - 0.3863150686237999 + - -0.37690452827133364 + - -0.34893479030358127 + - -0.07335302931907087 + - - 0.16693800781399992 + - 0.005394633503732046 + - 0.05236532931922369 + - -0.2320975481004007 + - -0.25842256129817975 + - - -0.07725894463746617 + - 0.150649458663615 + - 0.050087480712582094 + - 0.3745134756446062 + - -0.02431033793295473 + - - -0.27003908777563884 + - 0.2901709025927058 + - -0.3546670523393916 + - -0.36436155271432985 + - 0.03651470716837575 + - - -0.32108833643814677 + - 0.11802772716870968 + - 0.14881127437278965 + - 0.26406953165348784 + - 0.26049877020851886 + - - 0.17508942727037166 + - 0.07516552799833877 + - 0.17850291315018707 + - 0.3601769599806957 + - 0.003466820196038751 + - - 0.3667723047384918 + - -0.11287631309355094 + - 0.2272234189515299 + - 0.05287271135296442 + - 0.13257295366264804 + - - -0.22845857796273042 + - 0.03096872749873777 + - -0.23055796402292011 + - 0.13873363458620155 + - -0.18488270405859109 + - - -0.18400661973285898 + - -0.016123380005281133 + - -0.15654111351971653 + - 0.32911107863020456 + - -0.19672320640130256 + - - 0.05193497288510673 + - -0.3032556512293548 + - 0.36893267229696947 + - 0.003620948210812366 + - -0.0390227870596316 + - - 0.11798065615207687 + - -0.21463894028272787 + - 0.14470957159240572 + - 0.10473807077972676 + - -0.3034827834248236 + - - 0.18143999845728037 + - -0.29022845895287624 + - 0.24239889170806395 + - 0.08092498547972143 + - -0.27091058258618883 + - - -0.025962254895722407 + - -0.32320042757474404 + - 0.00944493440361434 + - -0.37659211401566733 + - -0.12090975734412258 + - - 0.13914846278313975 + - -0.36190265610728367 + - -0.345121739571488 + - 0.3666897475740704 + - -0.23663407984613768 + - - -0.28117724230097424 + - -0.3482935640251905 + - 0.011078574073914218 + - 0.16004223335456821 + - 0.3614686961516761 + - - 0.15265019896041013 + - 0.03919674668030359 + - 0.07933011131248942 + - 0.4118041022473589 + - -0.19917149715506582 + - - -0.29705350142063586 + - -0.2573913724532826 + - 0.3413330988333964 + - -0.2629345752977957 + - -0.33925716711712006 + - - -0.3090126659916563 + - 0.10052600358008285 + - 0.3295391136582312 + - -0.20642069215799752 + - 0.1505575795303182 + - - -0.3432080532310526 + - 0.3164411332145225 + - 0.21984254570387593 + - 0.14569302992407368 + - -0.2789802513964337 + - - 0.06858600492516646 + - 0.003213025851039919 + - -0.34745085008036425 + - -0.3025951406540648 + - 0.3360807249658782 + - - 0.32079300335979 + - 0.10559011069365329 + - 0.12094144536768299 + - 0.33662630333028337 + - -0.35442232207439917 + - - -0.30186065289187725 + - -0.346981607427445 + - 0.3899552474706737 + - 0.16646982977851396 + - -0.06503610879430799 + - - 0.023620358718866294 + - -0.13711543258356879 + - -0.22371664723989837 + - 0.18122464518071227 + - -0.2238394582304553 + - - -0.23312745666197218 + - 0.10470224590876251 + - 0.050192516659196086 + - -0.3607304972415714 + - 0.39592397024699677 + - - 0.3541674922988369 + - 0.034944883058862765 + - 0.004196837614533963 + - 0.36513421403017227 + - -0.2939792596841648 + "@version": 1 + activation_function: none + bias: false + precision: float64 + resnet: false + use_timestep: false + ntypes: 2 + precision: default + repformer_args: + activation_function: tanh + attn1_hidden: 5 + attn1_nhead: 4 + attn2_has_gate: true + attn2_hidden: 5 + attn2_nhead: 4 + axis_neuron: 4 + direct_dist: false + g1_dim: 5 + g1_out_conv: true + g1_out_mlp: true + g2_dim: 5 + ln_eps: 1.0e-05 + nlayers: 3 + nsel: 40 + rcut: 4.0 + rcut_smth: 3.5 + set_davg_zero: true + trainable_ln: true + update_g1_has_attn: false + update_g1_has_conv: true + update_g1_has_drrd: true + update_g1_has_grrg: true + update_g2_has_attn: false + update_g2_has_g1g1: false + update_h2: false + update_residual: 0.01 + update_residual_init: norm + update_style: res_residual + use_sqrt_nnei: true + repformers_variable: + "@variables": + davg: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + dstd: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + env_mat: + rcut: 4.0 + rcut_smth: 3.5 + g2_embd: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -1.0120525255965693 + - -1.3410942661505185 + - 0.6444248980785466 + - 1.3379360916834435 + - -0.9400579171669438 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.019464291658135142 + - -0.018782174023876802 + - 0.053736857134061365 + - -0.21761095463941962 + - 0.22908429306304245 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + repformer_layers: + - "@class": RepformerLayer + "@variables": + g1_residual: + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.03603003169654137 + - 0.012497448175246137 + - -0.01095320901085369 + - -0.03415370741201022 + - -0.033128449146010305 + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.006919593857755369 + - 0.010748609458630657 + - 0.004842926409136031 + - -0.011656955546082724 + - 0.004788783773278474 + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.0004263964322652511 + - -0.0028300152727785068 + - 0.01952962243649864 + - 0.0027873043447218014 + - 0.001309288766687558 + g2_residual: + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.01160023747691338 + - -0.0004448807549913108 + - 0.0008057624078188488 + - -0.024948515472675986 + - -0.019416324515653484 + h2_residual: [] + "@version": 2 + activation_function: tanh + attn1_hidden: 5 + attn1_nhead: 4 + attn2_has_gate: true + attn2_hidden: 5 + attn2_nhead: 4 + axis_neuron: 4 + g1_dim: 5 + g1_out_conv: true + g1_out_mlp: true + g1_self_mlp: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -1.30811432030891 + - 1.7317839475528145 + - 1.399643928837452 + - -2.217598009660054 + - -0.3280510654318928 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.19058890417971588 + - 0.3463019129386775 + - -0.3238515676656896 + - 0.4620257390575868 + - -0.11979316985218211 + - - -0.5091348418247256 + - 0.5937549073105088 + - -0.4101966440417052 + - 0.07750470968878109 + - -0.3424037916252215 + - - -0.6019537986876181 + - 0.18600176889845013 + - 0.1980666907358186 + - -0.09605024233548902 + - -0.5160961441700344 + - - -0.22056069372777706 + - -0.7447000890755333 + - -0.06841639167039011 + - -0.3211447460158319 + - 0.01879819061642492 + - - 0.17548998966047413 + - -0.007952594370924146 + - 0.19396423635351934 + - -0.274239700940922 + - 0.2571037042854489 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + g2_dim: 5 + linear1: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.6292962632873957 + - 0.3041398278338624 + - -0.26570178182208953 + - 1.0069393034707894 + - -0.017831983893162602 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.08396232707317755 + - -0.2590789034376074 + - 0.06449599213906514 + - -0.026485184870448455 + - -0.11502287050655546 + - - -0.3394134083847728 + - -0.04182949795373899 + - -0.18355759680044953 + - -0.07272151368022486 + - 0.202216848914141 + - - -0.09852715985600499 + - -0.10543705177859736 + - 0.08879304650716603 + - 0.08474028791239975 + - 0.22150741767418541 + - - -0.03346579823549347 + - 0.08142402535224946 + - 0.20444458395431703 + - 0.2061630292035231 + - -0.34623750552383953 + - - 0.045881739265562126 + - 0.03235926439065396 + - -0.06514538897263505 + - -0.09157218195401022 + - -0.16078786248733104 + - - 0.10337932580707862 + - -0.009900109711506542 + - -0.09848266744555643 + - -0.06743723410229494 + - -0.034295685655753826 + - - -0.024749851911743403 + - -0.10168528807416925 + - -0.08321216530050654 + - 0.08263273817835241 + - 0.06961247702103983 + - - -0.026904632217682176 + - 0.024565437698427974 + - -0.015916989311626998 + - -0.2529377102697093 + - -0.33605661981070634 + - - -0.027971199641699127 + - -0.09923898814189575 + - -0.24178299388114752 + - 0.029602144279883807 + - 0.09859016934223175 + - - 0.12904137491494896 + - 0.01463153375175068 + - -0.030196990745127137 + - -0.03427710675704333 + - 0.0769092571140682 + - - 0.06078298146276607 + - 0.018624014276540105 + - 0.007625746651479272 + - -0.05212163740127107 + - -0.22961856283351262 + - - -0.24276750771398306 + - 0.015459667548397407 + - -0.024917383364799983 + - -0.07328719787935754 + - 0.10317938994270194 + - - 0.06207164078936751 + - -0.10450229276912223 + - 0.06706176715814717 + - 0.055976275244021684 + - -0.018233802569777677 + - - -0.06651532308872152 + - -0.08647319137042646 + - -0.09169294749680779 + - 0.129348538280104 + - 0.006274092835851255 + - - -0.062332536772224355 + - -0.12119349201175855 + - -0.06183693675207785 + - 0.0008820048050103422 + - 0.12406819642946329 + - - 0.036026233381260604 + - 0.08058280500947529 + - 0.02802481232492143 + - 0.14557999799990246 + - 0.25206957815030306 + - - -0.19644397693165241 + - 0.11483898331021172 + - -0.07929205314453085 + - 0.13685466931987425 + - 0.029385541250605204 + - - -0.20239024913689344 + - 0.14260455767505056 + - -0.12672049424541829 + - 0.19878940946568238 + - 0.21052724203164538 + - - -0.14411612791600975 + - -0.04190247752914743 + - 0.07299916367427191 + - 0.1440709108775927 + - -0.1613102600483591 + - - 0.3114860420321912 + - 0.07687254774336891 + - 0.03723959101138982 + - 0.012729756801082936 + - -0.24720255506387367 + - - 0.1623672745194676 + - -0.17803926391541774 + - 0.07601730846902242 + - -0.07896998871476738 + - -0.1424258418559638 + - - 0.03553129535089544 + - -0.14295036742419862 + - 0.07638378413519416 + - -0.07390601295144453 + - 0.12940724982987217 + - - -0.02842164520441565 + - 0.13939917807001465 + - 0.47701969821105683 + - -0.031117611945881554 + - -0.03500981062313414 + - - 0.17217654358849513 + - -0.20172150565508037 + - 0.14182112976591155 + - -0.06382811614171423 + - -0.007306675305514548 + - - -0.15447228144755248 + - -0.02312456900409192 + - -0.09544935736484167 + - 0.07250584700668984 + - 0.1574085006156906 + - - -0.12603968435322543 + - -0.025573781632627562 + - 0.1508227463536938 + - -0.30345724164088406 + - 0.1854020066002888 + - - -0.1635859501573259 + - -0.08480199517991185 + - 0.08817054366324961 + - 0.16171683703905798 + - -0.12004204073976865 + - - -0.08111522326105529 + - -0.0024435761674501118 + - -0.052941182960640855 + - 0.23910390490710043 + - -0.21315524715166578 + - - -0.05926997962527499 + - -0.008935034265033262 + - 0.14683102932558992 + - -0.01918527903899294 + - -0.03406480065791599 + - - -0.1337717203489477 + - -0.021818018335351835 + - 0.024971591316419486 + - 0.06704069613758198 + - 0.040648989162459674 + - - -0.004444956659464356 + - -0.0003425146958406023 + - 0.17960753789619216 + - -0.27214634408723903 + - 0.07711820341688266 + - - 0.133652261731334 + - -0.009797974080371686 + - -0.4259816212787344 + - 0.23200562464230318 + - -0.02493040660085401 + - - -0.046836875861095834 + - 0.001645473952655283 + - -0.05473403991636848 + - -0.05378549705402274 + - -0.3889996124421639 + - - 0.02092041296068538 + - 0.21891176724882613 + - 0.25305998826597703 + - -0.00737941664247247 + - -0.07319199260494484 + - - 0.22207531087979715 + - 0.1167463561271954 + - 0.05854914028062706 + - 0.02828761486751832 + - 0.014280499410575949 + - - 0.21548357500898635 + - -0.14325757178810586 + - -0.37108308687673025 + - -0.30841574977024155 + - -0.15765248368668322 + - - -0.19065434721674077 + - 0.2894449163901936 + - 0.10368226466064218 + - 0.002272586212844238 + - -0.06685991839970858 + - - 0.15850988743880434 + - -0.19930536837479582 + - 0.06352955279220247 + - 0.18233644655152334 + - 0.177009225453199 + - - 0.08440437483086662 + - 0.053514367173557176 + - -0.08416559269376686 + - 0.04962224184852935 + - -0.19450578606057445 + - - -0.02627920444598498 + - -0.11978290209672943 + - 0.06513795302813882 + - 0.028386691085269353 + - -0.16676268182611712 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + linear2: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.2592964101062212 + - 0.6050098232448291 + - -0.005515314503147 + - 0.11603766186289032 + - 0.7299519869702973 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.22980393702142735 + - 0.08816839372355742 + - -0.7825210216367764 + - 0.47400651965129326 + - -0.09715501151613053 + - - 0.051226778173106544 + - -0.0586569497395102 + - 0.07008245083492698 + - -0.27909388065497365 + - -0.403409427380388 + - - 0.4155289437793008 + - -0.23023614159453773 + - -0.06319940162259689 + - 0.49105437825377674 + - -0.672285862471505 + - - 0.2628024247581461 + - 0.30092184220502505 + - -0.04589377746162835 + - -0.15376402934013342 + - -0.3459379045607231 + - - 0.055019077191780244 + - -0.15428864792280397 + - 0.03686133046649239 + - 0.22797050584554945 + - -0.2895756986826399 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + ln_eps: 1.0e-05 + ntypes: 2 + precision: default + proj_g1g2: + "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.5532734073335777 + - -0.2894171115724634 + - -0.34154590578539124 + - -0.5741289385215242 + - 0.22542651626880558 + - - -0.1258999860718108 + - -0.23796762711809444 + - 0.056052343409511166 + - 0.20182107205251548 + - 0.07978830712924143 + - - -0.10108756888794897 + - -0.31868861303852497 + - 0.2266451364666591 + - 0.013827304866388349 + - 0.050907970632244975 + - - -0.09037692956629029 + - -0.27064175886126934 + - -0.25149093441780035 + - -0.11031261523979898 + - 0.20910864059883363 + - - 0.1704620928115622 + - 0.45496457562319714 + - -0.39714014820404625 + - 0.052072985229575805 + - 0.20305217115768973 + "@version": 1 + activation_function: none + bias: false + precision: float64 + resnet: false + use_timestep: false + rcut: 4.0 + rcut_smth: 3.5 + sel: &id001 + - 40 + smooth: true + trainable_ln: true + update_chnnl_2: true + update_g1_has_attn: false + update_g1_has_conv: true + update_g1_has_drrd: true + update_g1_has_grrg: true + update_g2_has_attn: false + update_g2_has_g1g1: false + update_h2: false + update_style: res_residual + use_sqrt_nnei: true + - "@class": RepformerLayer + "@variables": + g1_residual: + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.030953153877771103 + - 0.004550247326878251 + - 0.013303927865191467 + - 0.01018780786448025 + - 0.0155549810199352 + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.016276946544039366 + - -0.0007364959557409706 + - -0.004972067050977963 + - 0.005248593373274716 + - -0.0056900226522463215 + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.008800796363452382 + - -0.005593693472478371 + - 0.032199083632300035 + - 8.400962254808775e-05 + - -0.012730621609703547 + g2_residual: + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.00982260814551794 + - 0.0042572728334056365 + - 0.009538800228021472 + - 0.00047524228131468776 + - -0.015464154773430883 + h2_residual: [] + "@version": 2 + activation_function: tanh + attn1_hidden: 5 + attn1_nhead: 4 + attn2_has_gate: true + attn2_hidden: 5 + attn2_nhead: 4 + axis_neuron: 4 + g1_dim: 5 + g1_out_conv: true + g1_out_mlp: true + g1_self_mlp: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.0730561183538059 + - 2.776096418581049 + - -1.6878494103454023 + - 0.6319621912698188 + - 0.7296819544535204 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.30406067533186854 + - -0.23319974862010298 + - 0.4268841113647301 + - -0.3171107228509156 + - 0.23705159038283963 + - - 0.14924431344154163 + - -0.3277346372033825 + - 0.03732222579147385 + - -0.06231168041312384 + - -0.27967515711810453 + - - -0.17033596314716415 + - -0.002809366135203804 + - 0.5350728562707233 + - 0.04409125365519289 + - -0.23373164532325605 + - - 0.16251375866692905 + - -0.2669074996515733 + - 0.4046092505537821 + - -0.03440243154913439 + - 0.14308632480367547 + - - -0.3212722334397611 + - -0.14397893865966555 + - 0.2031848262908836 + - 0.08760210337263934 + - 0.690524747593835 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + g2_dim: 5 + linear1: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.3904504721256209 + - -0.7387582311089921 + - -0.6516004102844352 + - -0.4170397034404462 + - -0.8279414759908088 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.07233303518597486 + - -0.12559877932713687 + - 0.05665805267436587 + - 0.08680631673659558 + - 0.0025329042894111187 + - - 0.2870588620333185 + - -0.07786427816699869 + - -0.07104575536059457 + - 0.048253184585550064 + - -0.1640024445711842 + - - 0.18797971218330461 + - 0.06771349169052267 + - -0.07907380461980497 + - 0.05525437486420736 + - 0.02009520745986023 + - - 0.281038963580294 + - 0.2270448019984451 + - 0.04662719213217196 + - 0.07123094368297082 + - -0.10806283754971098 + - - -0.07898984260721922 + - -0.10739362148061957 + - 0.0033415947030256544 + - 0.032288529511892566 + - -0.03173790906780475 + - - -0.011155332801251748 + - 0.1316727549039841 + - 0.0971263766783617 + - 0.17867926273983348 + - 0.03672718518126696 + - - 0.09157897721667 + - 0.09926237313114537 + - -0.21258585423818205 + - 0.1269364386377713 + - 0.30222502480313734 + - - -0.4265044494307036 + - 0.014698325150853153 + - 0.222526397099498 + - -0.0515765918179406 + - 0.04461419978150989 + - - -0.17174281294203816 + - 0.2751118183268816 + - -0.09571052405552033 + - 0.10674231950444127 + - -0.2665717704888117 + - - -0.08713033504338041 + - 0.05286235812039554 + - -0.13465378907856126 + - 0.26029622715251594 + - 0.20429631782598345 + - - -0.1931696011063644 + - 0.03179373592007634 + - -0.01705227065987145 + - -0.15627913293510198 + - 0.07755903941265974 + - - -0.11049696053897917 + - -0.057292985864107124 + - -0.010211172262537599 + - -0.16280061653720834 + - 0.07661291164398892 + - - -0.35140753207139847 + - -0.06810004447528932 + - 0.10839694449933315 + - 0.03542613606995244 + - -0.06775694369641179 + - - -0.04147634682326751 + - -0.056638697310459854 + - -0.05330569239674951 + - 0.13901111988568746 + - -0.06824938335129761 + - - -0.11203618974941376 + - 0.3604814644601604 + - -0.10640848463730161 + - 0.02699744755022092 + - 0.010353729905313842 + - - 0.12662021724846018 + - -0.15433041202985273 + - -0.28807521824574284 + - 0.20393023164034899 + - -0.09407420816857529 + - - -0.11791962062708798 + - 0.10090518368799273 + - 0.3166277996749642 + - 0.09456371288740745 + - 0.13776853376528053 + - - 0.21434164527122126 + - -0.0473284024955143 + - -0.09804549668998058 + - -0.03296726988358063 + - -0.02246160526373819 + - - -0.04965182688872488 + - -0.1861644408143712 + - 0.005313676453730348 + - -0.010360120573932947 + - -0.3078070692016113 + - - 0.10048335615799668 + - -0.08731584533464844 + - -0.19140719426127487 + - 0.09445837662615653 + - 0.27757444837207024 + - - -0.07841883765491009 + - 0.0471220563723184 + - 0.021673650695265518 + - 0.13963872028707364 + - -0.006825295820998376 + - - -0.19271438135057883 + - -0.007110790191465846 + - -0.08217641423459685 + - -0.025890309182111926 + - 0.06403918521905971 + - - -0.2968684802524053 + - -0.07467269668438187 + - -0.019663765996688794 + - -0.20157188265864767 + - -0.015590896465403993 + - - 0.15120523240819497 + - 0.040544407430732454 + - -0.14427351582541523 + - -0.08588535919441226 + - -0.09050202476744904 + - - 0.055015238092817935 + - -0.14935031270240165 + - -0.11538708778119777 + - 0.2118218514797107 + - 0.06777301739072661 + - - -0.018499557084470993 + - -0.1961687250411221 + - 0.3651860346902693 + - 0.27833350069061785 + - 0.025619643555402506 + - - 0.05902038518224982 + - 0.2800929655786798 + - -0.1055623585063209 + - -0.15935345894232575 + - 0.2517592270664209 + - - -0.1313006730876836 + - 0.21938815584964638 + - -0.18293917289674955 + - 0.005219129308061493 + - -0.10128044828072286 + - - 0.2452850640707537 + - 0.037943632583206474 + - 0.08442200151768535 + - 0.0068233590078222535 + - 0.25510063580027 + - - -0.0017976530933192004 + - -0.07441759598153459 + - 0.0814058326168008 + - 0.10158131544467495 + - 0.16953645649921872 + - - 0.12128479191043083 + - -0.042781762199358454 + - 0.007426922447889091 + - 0.04627483821729731 + - 0.07022983337840087 + - - -0.0511176676858341 + - -0.06232114476630841 + - -0.09207601218193863 + - 0.03228648493806836 + - 0.3338877697814744 + - - 0.055592097950266525 + - 0.2427801930543228 + - 0.009889478166058258 + - -0.027476734426876356 + - -0.027202887337284466 + - - 0.17481965178682457 + - 0.1064657969944493 + - 0.09565306493013129 + - 0.29187520131762024 + - 0.04937333337412164 + - - 0.0711114075126626 + - -0.03924682971036787 + - -0.05911820824729128 + - -0.016236488108268037 + - -0.24994434115230696 + - - -0.017473370139498092 + - 0.005054368701559544 + - -0.0018005121808373533 + - 0.2494665904609818 + - -0.13141342964673194 + - - -0.48951968995103823 + - -0.07991897204533437 + - -0.07265925729464501 + - -0.35037006167764917 + - -0.035530910846305705 + - - -0.024529386317393667 + - 0.125441077090495 + - 0.05072755218603061 + - -0.03358126521780828 + - -0.20649865854135296 + - - 0.27783626218193974 + - 0.3489366772451567 + - -0.09634345998938784 + - -0.061231461806113344 + - -0.12164226668578611 + - - -0.11350896510363769 + - 0.20888045493504787 + - -0.061339620252498527 + - -0.0494159943463361 + - 0.07315534698550205 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + linear2: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.39419698530848374 + - -0.6417653194947952 + - 0.1468172295786452 + - 1.184577336104801 + - 0.5081978769638908 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.0066873932717765395 + - -0.12251150304647253 + - 0.7086314961675694 + - 0.08910236706793025 + - 0.1156306065848897 + - - -0.20486974188140508 + - 0.4061737224632258 + - -0.03632714518429385 + - 0.046287906724936156 + - -0.3900507826710705 + - - -0.2351514218004438 + - -0.5837581895052254 + - -0.24421716883694933 + - 0.14058729936441064 + - -0.39625249214829994 + - - -0.3368066757750851 + - -0.11444928445140763 + - -0.216424188896182 + - -0.03014362208217597 + - -0.21739981725330465 + - - -0.4151991607396354 + - 0.14239346929129224 + - 0.6065187044001205 + - 0.17679720954491984 + - 0.18137573756648276 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + ln_eps: 1.0e-05 + ntypes: 2 + precision: default + proj_g1g2: + "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.013767481419125458 + - 0.7128447681363075 + - -0.3388321535306186 + - 0.12895013965521143 + - 0.1759839796572137 + - - -0.17995579630766076 + - -0.10490891548428505 + - 0.17227112758807675 + - 0.5043682738830814 + - -0.5177896277554952 + - - -0.028086154477676623 + - 0.6331413729833129 + - 0.041191722613779125 + - -0.18618113150914578 + - 0.20480913933465447 + - - 0.1161772622437584 + - -0.43735266009160034 + - -0.1966245142374793 + - 0.7403002581659407 + - 0.7077246669326973 + - - -0.06815761371165154 + - 0.13160740208693508 + - 0.5921753126883629 + - 0.3803766737952691 + - -0.046876897835655046 + "@version": 1 + activation_function: none + bias: false + precision: float64 + resnet: false + use_timestep: false + rcut: 4.0 + rcut_smth: 3.5 + sel: *id001 + smooth: true + trainable_ln: true + update_chnnl_2: true + update_g1_has_attn: false + update_g1_has_conv: true + update_g1_has_drrd: true + update_g1_has_grrg: true + update_g2_has_attn: false + update_g2_has_g1g1: false + update_h2: false + update_style: res_residual + use_sqrt_nnei: true + - "@class": RepformerLayer + "@variables": + g1_residual: + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.012170950513902995 + - 0.0056982009234836295 + - -0.014772204332654533 + - 0.008484024106957531 + - 0.00849914730737344 + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.03246587217116422 + - -0.016893025175096388 + - 0.012435698330610843 + - 0.020187947808578702 + - 0.006687558900631235 + - "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.011748661520302154 + - -0.002501192068144276 + - -0.014619574984816258 + - -0.00025857395887020297 + - -0.011081880220023974 + g2_residual: [] + h2_residual: [] + "@version": 2 + activation_function: tanh + attn1_hidden: 5 + attn1_nhead: 4 + attn2_has_gate: true + attn2_hidden: 5 + attn2_nhead: 4 + axis_neuron: 4 + g1_dim: 5 + g1_out_conv: true + g1_out_mlp: true + g1_self_mlp: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.22622119705468932 + - 1.679972567436481 + - 0.8617849583979595 + - 0.7627209179213263 + - 0.08736709822833234 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.12167279667097665 + - -0.05876474635765746 + - 0.01001600975306451 + - 0.5491115954893747 + - 0.1738236476960245 + - - -0.3362357644991349 + - -0.2174002731903439 + - -0.12518015854971282 + - -0.5928577746423984 + - 0.07857201204414647 + - - -0.6509218388064963 + - 0.3415018469079166 + - -0.08849907468808393 + - -0.0072378826748915985 + - 0.14619134458027205 + - - -0.14740735248742085 + - -0.0063016032593476295 + - -0.09839776527112142 + - 0.19985375347739473 + - 0.19764726057708193 + - - -0.16575148152801386 + - -0.3304732289437867 + - 0.45087541559586225 + - -0.11539370596670748 + - -0.5659729701689729 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + g2_dim: 5 + linear1: + "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.04476047832627152 + - -1.8078872112598667 + - 2.047538554462726 + - -0.4313795822933001 + - -0.7411876884018038 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.02120826400167494 + - -0.20276242117630586 + - 0.24387467563095325 + - 0.10303126756068341 + - 0.051025069833096175 + - - -0.03374151054389157 + - 0.032688321848361145 + - -0.13788376296513702 + - -0.10889072552319669 + - 0.22432429428309092 + - - -0.17057797559937082 + - -0.01330308815114757 + - 0.17325681446662627 + - -0.045057383108055585 + - -0.09778619431562305 + - - -0.38340838579797915 + - 0.09212560805687599 + - -0.14003455421868935 + - -0.22433560375321876 + - -0.2834092517263271 + - - -0.11250033669131652 + - 0.2936406637464358 + - -0.1634908218886667 + - 0.09011330992430655 + - -0.251553266648588 + - - 0.2002812725896845 + - 0.18806047286167354 + - -0.1445594203730198 + - 0.2596828111976336 + - -0.003130421956802045 + - - 0.21828687409081016 + - -0.13414842719178494 + - -0.24666529269789395 + - -0.006883518402413685 + - 0.05769283363709148 + - - -0.3054723048189706 + - -0.06387554521612063 + - -0.18766119271870504 + - -0.12509613691242047 + - 0.055240333151730776 + - - 0.015469398501610828 + - -0.0823150717826605 + - -0.16675512192642816 + - 0.12935809271217594 + - 0.07713906361783558 + - - -0.045899178406135374 + - 0.1396668327265014 + - 0.26340289691123836 + - 0.0048105822723732644 + - -0.005366986901183898 + - - 0.009290570011027783 + - -0.060519424426768775 + - 0.13006197150464363 + - -0.01785373737250758 + - -0.014898842675596258 + - - 0.1269696841481518 + - -0.03191557171377839 + - 0.1526428291590831 + - 0.06812463690309147 + - 0.1181645022470457 + - - -0.008354378466241394 + - 0.05983437407138071 + - 0.06201711768881509 + - -0.2712250988812433 + - -0.12835557643255655 + - - 0.3624815275568562 + - 0.02126087985755094 + - 0.11631761909889272 + - -0.055310241744757925 + - 0.16972568359433227 + - - -0.07463063674973691 + - 0.22762638743923655 + - 0.24432912187935354 + - -0.079083681709922 + - -0.014821139250702014 + - - 0.033932738843908794 + - -0.11705856512428435 + - 0.16089535272200908 + - 0.3188475709224389 + - -0.19925058656337122 + - - 0.05149532136704679 + - 0.34912853325652876 + - 0.03914985231841249 + - -0.14289800364536395 + - -0.024926754252559545 + - - 0.005878903575216287 + - 0.006351181553721704 + - 0.2151655940717292 + - -0.10973066883698986 + - 0.1965176044595831 + - - -0.04881865143285429 + - 0.05682148666175087 + - -0.004566442841927496 + - -0.10219483242326999 + - 0.05265465863908208 + - - -0.02890441167758548 + - 0.11807479061676636 + - -0.026782896957314253 + - -0.10741381535691857 + - -0.08460612842711608 + - - -0.29912522080035436 + - -0.041053273463352566 + - -0.08341514675036599 + - -0.15255641816499257 + - 0.032738166656675345 + - - -0.13127827514841212 + - 0.17337979922895738 + - -0.07999054412107975 + - 0.029187688342863987 + - -0.027991659012987048 + - - 0.0953753641153965 + - -0.1154037586787982 + - -0.1606200159638128 + - 0.03963080020458736 + - -0.28877505888277183 + - - 0.04834257331300868 + - 0.07109182789858672 + - -0.04018473714707446 + - 0.3392501402646008 + - 0.051706351939985955 + - - 0.2262052651345229 + - 0.06567796566839683 + - 0.02969873382446752 + - 0.307137329425125 + - 0.17947875928066645 + - - 0.08614098800132988 + - -0.29531982917953764 + - -0.16051475876915816 + - 0.19569343061448652 + - 0.03787520855977715 + - - -0.21429349518787014 + - 0.05394593886889696 + - -0.04993584771039846 + - 0.19564022713367052 + - 0.11362262179190846 + - - -0.004245970327980209 + - -0.1940574165136546 + - 0.007951406114803104 + - -0.08859796346311412 + - -0.032649124565685736 + - - -0.21731129328505974 + - -0.06621352576033905 + - 0.09129544921890727 + - -0.06541669039814363 + - -0.10724204962303797 + - - 0.057357048566617864 + - -0.008345673540796282 + - 0.29292258751655026 + - -0.12308726040552805 + - 0.04054304095472656 + - - 0.10394124106268385 + - 0.17444441607800482 + - 0.12456110243374384 + - 0.050099919442543044 + - -0.11282643776218643 + - - 0.17835449092593977 + - 0.09637084989472562 + - -0.1934254167912494 + - -0.2545118504213924 + - 0.06827181091761918 + - - 0.19626184614240083 + - -0.04699868343310416 + - -0.10007243420160061 + - -0.09383391698441179 + - -0.0990655246656314 + - - 0.012335198304450592 + - -0.2180497687723705 + - 0.1541401217483529 + - -0.11638836449441982 + - 0.2683999798967227 + - - 0.10896246206993876 + - -0.3225899091557129 + - 0.08447514888719702 + - -0.16532213737983084 + - -0.14340574861753197 + - - 0.27134405821317176 + - 0.37994741042339447 + - -0.061229587223300345 + - -0.10718219560731332 + - -0.0342547953758568 + - - 0.01995848716225226 + - -0.2369496772630444 + - -0.12037037553687044 + - -0.11437070301591287 + - 0.244046581192314 + - - 0.16709557426845523 + - 0.029705706114580222 + - 0.02950591956405181 + - 0.042079856333530945 + - 0.1289641022252176 + - - 0.1269877310037645 + - -0.2914364205391121 + - -0.2493182842173884 + - -0.3155095607393483 + - 0.057889936497034826 + - - -0.026087582504925794 + - 0.09059376415886668 + - 0.05302656666128242 + - 0.19074227440516286 + - -0.16835197038194713 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + ln_eps: 1.0e-05 + ntypes: 2 + precision: default + proj_g1g2: + "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.44534011123758094 + - 0.3517185018820327 + - 0.09140581073576556 + - 0.10509259688629408 + - -0.693942488230306 + - - -0.24023695288558378 + - -0.10202481638123778 + - 0.19072504173684576 + - 0.2987115067295286 + - 0.3039842054402882 + - - -0.14614782464590242 + - -0.2746073100636409 + - -0.6649874649402261 + - 0.30314217114609954 + - 0.8548523617893014 + - - -0.0037272725651430706 + - 0.42826436495159964 + - 0.14658274447536565 + - 0.3890848512382279 + - -0.7377284335342408 + - - 0.3773681827887734 + - -0.19069778577208663 + - -0.40778172197678264 + - 0.21385929050684915 + - -0.23807817854870678 + "@version": 1 + activation_function: none + bias: false + precision: float64 + resnet: false + use_timestep: false + rcut: 4.0 + rcut_smth: 3.5 + sel: *id001 + smooth: true + trainable_ln: true + update_chnnl_2: false + update_g1_has_attn: false + update_g1_has_conv: true + update_g1_has_drrd: true + update_g1_has_grrg: true + update_g2_has_attn: false + update_g2_has_g1g1: false + update_h2: false + update_style: res_residual + use_sqrt_nnei: true + repinit_args: + activation_function: tanh + axis_neuron: 5 + neuron: + - 5 + - 5 + - 5 + nsel: 108 + rcut: 6.0 + rcut_smth: 0.5 + resnet_dt: false + set_davg_zero: true + tebd_dim: 8 + tebd_input_mode: concat + three_body_neuron: + - 2 + - 4 + - 8 + three_body_rcut: 4.0 + three_body_rcut_smth: 3.5 + three_body_sel: 40 + type_one_side: false + use_three_body: true + repinit_three_body_variable: + "@variables": + davg: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + dstd: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - 0.2484323774795112 + - 0.18856311281779198 + - 0.18856311281779198 + - 0.18856311281779198 + - - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + - - 0.22487048413495345 + - 0.17407539794806373 + - 0.17407539794806373 + - 0.17407539794806373 + embeddings: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: embedding_network + networks: + - "@class": EmbeddingNetwork + "@version": 2 + activation_function: tanh + bias: true + in_dim: 17 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.43941908550486863 + - 0.9378261950772157 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.026265096160513004 + - -0.4639835283413547 + - - 0.03635647454640597 + - 0.07473758444527034 + - - -0.06992753819659699 + - 0.21986075742162492 + - - 0.07061419602422543 + - -0.0524592050658983 + - - -0.10868945785879074 + - -0.6393923325990258 + - - -0.4771175911983638 + - 0.2185816237968037 + - - -0.21775778011277241 + - -0.03846588547990851 + - - 0.2688575804342918 + - -0.022262286686160183 + - - 0.11139791007840963 + - -0.11383753559255314 + - - -0.5714738566517861 + - -0.11339892392396721 + - - 0.234274561882303 + - -0.2815645637897343 + - - -0.12797356315352978 + - -0.042039107070487636 + - - -0.0663246827412385 + - 0.1748397461193538 + - - -0.036346593063428266 + - -0.5376841980420106 + - - 0.002151021953151517 + - 0.15460640930804267 + - - 0.006481066742778678 + - -0.10520778210184074 + - - 0.24902329498264406 + - 0.1643944050570271 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.46486827708713296 + - 0.11781816864962305 + - 2.043777904940986 + - -0.06518765760721654 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.8388031982509411 + - 0.19742570339479432 + - -0.4757894936761817 + - 0.25494057061469866 + - - -0.26501627450969395 + - 0.29921478857516215 + - -0.4503188694359583 + - -0.555699105983989 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.36211325433682123 + - -1.474782667517953 + - -1.577999656211323 + - -0.665208648579387 + - -0.2968754579079675 + - 0.33237673982661636 + - -0.23852601602175583 + - -0.48970534633738644 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.15347549712808095 + - 0.06557762027792953 + - 0.0674498985020097 + - -0.28931880581807395 + - 0.08433956624127203 + - 0.40007512162053827 + - 0.047171932510215106 + - -0.43192983392825585 + - - -0.29002127476738354 + - 0.3010519137520722 + - 0.6236997835707944 + - -0.08736593092255791 + - -0.13973966203097968 + - 0.17215384978373047 + - 0.08768909794026612 + - 0.005232646216097761 + - - -0.14487959711385273 + - 0.13440625093514774 + - 0.11219192922053893 + - -0.3172037430673178 + - -0.028935720530630663 + - -0.1404831879240233 + - 0.03421585634032436 + - 0.031902064691486466 + - - -0.4670784225758848 + - 0.23080792888721513 + - -0.034071548427154236 + - 0.3635026497032477 + - 0.01725141617134657 + - 0.08667184666806436 + - -0.027586440920311633 + - 0.3547335062572569 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + neuron: + - 2 + - 4 + - 8 + precision: float64 + resnet_dt: false + ntypes: 2 + env_mat: + rcut: 4.0 + rcut_smth: 3.5 + repinit_variable: + "@variables": + davg: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + - - 0.0 + - 0.0 + - 0.0 + - 0.0 + dstd: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - 0.15519872219179812 + - 0.09699061260807051 + - 0.09699061260807051 + - 0.09699061260807051 + - - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + - - 0.13706276479932664 + - 0.08672582449204416 + - 0.08672582449204416 + - 0.08672582449204416 + embeddings: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: embedding_network + networks: + - "@class": EmbeddingNetwork + "@version": 2 + activation_function: tanh + bias: true + in_dim: 17 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9269543229421101 + - -0.23703601479020053 + - -0.4823021177542036 + - -1.4228502883640606 + - -2.011213316161816 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.19283446648725555 + - -0.36591818629805983 + - -0.15211699281081714 + - -0.039633317878387885 + - 0.08412479500393036 + - - 0.26348734235446575 + - -0.11555307251357866 + - 0.006660027683729128 + - -0.019346367290438243 + - 0.021346630671683325 + - - 0.13448295451127248 + - -0.018369442651599413 + - 0.21822347435795875 + - -0.5862539690338648 + - -0.03882603721619449 + - - 0.4562437634385346 + - 0.0922020249035163 + - -0.08537728490580257 + - -0.021504575261091438 + - 0.7537494236523268 + - - 0.058577520908596456 + - -0.297231972380086 + - 0.31401326943447117 + - 0.46604390397410916 + - -0.1079660066450081 + - - -0.016397124963663072 + - 0.193877750145573 + - 0.27323597326251514 + - 0.19024717476711756 + - 0.4902622942180982 + - - -0.07398866271485056 + - -0.32387509250925417 + - -0.20144274644415622 + - 0.3184551957437682 + - 0.05231949884880957 + - - -0.06009353811716006 + - 0.1737334138251616 + - -0.030962167721662194 + - -0.3036329366266574 + - -0.03161563299627668 + - - -0.22386979617490793 + - -0.11241202512640262 + - 0.0956477518147091 + - 0.149473360709335 + - -0.5834842034552281 + - - -0.29621075081021037 + - -0.2830710916386785 + - -0.40204993504967584 + - -0.43071084216223127 + - 0.14104372569244336 + - - 0.01845290217537068 + - -0.07375824446050101 + - 0.12504281011315418 + - -0.15207732006538546 + - 0.2551513482964309 + - - -0.024460540016230218 + - -0.2997661998703328 + - 0.19544625222543976 + - 0.04807700173152966 + - -0.22437119604868247 + - - 0.13184243108870328 + - -0.00655765860570148 + - 0.38000312984475265 + - -0.27888427289533213 + - 0.0523989672895371 + - - -0.36462365192301033 + - 0.2424520289960548 + - -0.14147066767231933 + - -0.2628867980693902 + - 0.4298456873841488 + - - -0.17116788917189402 + - -0.18512494024858211 + - -0.18136447808496087 + - -0.3087350626017898 + - -0.45704153153985133 + - - -0.21642261388083456 + - 0.1735543598039101 + - 0.12961593877456143 + - 0.30453456449045946 + - 0.013523974010561922 + - - -0.2135497141182742 + - 0.1500783241424191 + - 0.11827264405808366 + - 0.02356320702723967 + - -0.12559343259716768 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.10135465784739055 + - 0.5563348164690164 + - -0.35665415789438026 + - -2.529333391603986 + - -0.6897370433713996 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.02728733154369319 + - 0.34130728631608 + - -0.03568730885475739 + - 0.2806831273127007 + - -0.2534529086482955 + - - 0.0938752210762737 + - 0.20716028680714232 + - -0.18709754258589167 + - -0.003746032146125652 + - -0.07950919542774962 + - - 0.38983379896498505 + - -0.3109696383589871 + - 0.16903169446000998 + - -0.43353022307834055 + - -0.07037761125406733 + - - -0.1771462337798467 + - 0.3699660287991744 + - 0.49624472738258896 + - 0.13924527117477936 + - 0.6182673667623552 + - - -0.3420404033654241 + - -0.10075864284818886 + - -0.0020930780896084565 + - -0.2535436493462217 + - -0.5878699357609878 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9852698210289226 + - -0.7516427000555517 + - 1.954718712962926 + - -1.3330436009980762 + - 1.1124496499921253 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.610428145819889 + - 0.16457695424561933 + - -0.10628976953976568 + - -0.10270959121450651 + - 0.710010727298032 + - - -0.21316268003180913 + - 0.1601285991489345 + - 0.017821166720948873 + - -0.1658766563788847 + - -0.5157841154491742 + - - 0.1301734160138573 + - 0.44333852482803526 + - -0.4706128872051425 + - -0.026771684706215094 + - -0.5432790014276224 + - - 0.13432831349954696 + - 0.05915400213144824 + - 0.30068669323555086 + - -0.2597730228141981 + - -0.04895968969299514 + - - -0.22048431980779148 + - -0.4194490160378933 + - 0.007756177005246415 + - -0.3298891389130536 + - -0.5385584464634693 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + neuron: + - 5 + - 5 + - 5 + precision: float64 + resnet_dt: false + ntypes: 2 + env_mat: + rcut: 6.0 + rcut_smth: 0.5 + smooth: true + trainable: true + type: dpa2 + type_embedding: + "@class": TypeEmbedNet + "@version": 2 + activation_function: Linear + embedding: + "@class": EmbeddingNetwork + "@version": 2 + activation_function: Linear + bias: false + in_dim: 2 + layers: + - "@class": Layer + "@variables": + b: null + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.5016826093036629 + - -0.5279194903676838 + - -0.0549678404477373 + - -0.038069148958863784 + - -0.36174151294282214 + - -0.2514151046175414 + - 0.08245655199851126 + - 0.026302755666446104 + - - -0.07831498854680775 + - -0.008641242501326772 + - 0.22177790678578946 + - -0.14363349563193728 + - -0.3164380301609334 + - -0.14466111798293158 + - 0.06012655136452968 + - 0.07616883527453565 + "@version": 1 + activation_function: Linear + bias: false + precision: float64 + resnet: true + use_timestep: false + neuron: + - 8 + precision: float64 + resnet_dt: false + neuron: + - 8 + ntypes: 2 + padding: true + precision: default + resnet_dt: false + trainable: true + type_map: &id002 + - O + - H + use_econf_tebd: false + use_tebd_bias: false + type_map: *id002 + use_econf_tebd: false + use_tebd_bias: false + fitting: + "@class": Fitting + "@variables": + aparam_avg: null + aparam_inv_std: null + bias_atom_e: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.0 + - - 0.0 + fparam_avg: null + fparam_inv_std: null + "@version": 2 + activation_function: tanh + atom_ener: [] + dim_descrpt: 13 + dim_out: 1 + exclude_types: [] + layer_name: null + mixed_types: true + nets: + "@class": NetworkCollection + "@version": 1 + ndim: 0 + network_type: fitting_network + networks: + - "@class": FittingNetwork + "@version": 1 + activation_function: tanh + bias_out: true + in_dim: 13 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.3349859616903922 + - -0.45748055191068804 + - 1.0314434101351464 + - -0.6562475549893949 + - 0.9498122103417428 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.28734085240489987 + - -0.22799376929792833 + - 0.09371468724415302 + - -0.060343990641131336 + - -0.1605587616678341 + - - -0.500828607464722 + - -0.39769032445849883 + - -0.13097956796562052 + - -0.23212793717704652 + - -0.038828884528037115 + - - 0.23321046838546103 + - 0.017315597110918363 + - 0.13631624095760458 + - 0.23691624195155855 + - 0.005574145933647628 + - - -0.20133887020224747 + - -0.328829379978232 + - 0.34759416395637244 + - 0.1944497447741702 + - 0.3193324891906819 + - - 0.019880427431400238 + - 0.006034434080859869 + - 0.28792741597790694 + - -0.05048129942486406 + - 0.2568884031435667 + - - -0.07159867806442435 + - 0.2954506374545977 + - 0.29676436126009775 + - 0.11528861832629143 + - 0.08716069714021854 + - - 0.02839550934091151 + - -0.5658931776162197 + - -0.12736808072489597 + - -0.2978927418496175 + - 0.08156233385616206 + - - -0.21714384551138263 + - -0.17752510849514816 + - -0.1873420473309751 + - -0.24301014238016175 + - 0.15351478595992818 + - - 0.3901008433965192 + - -0.23477779245126928 + - 0.07766405087449278 + - -0.28986099335396964 + - -0.055080083740405905 + - - -0.31078867820981393 + - -0.22574724498621582 + - 0.4107563625227253 + - -0.2557694947708352 + - 0.36134010096258296 + - - 0.2572164450054561 + - -0.20523865915689532 + - -0.10738066546619592 + - -0.306753245712776 + - -0.3876447597823812 + - - 0.04476080392863874 + - 0.166299366041299 + - -0.13581197624774488 + - -0.3027853280458097 + - -0.2496523280475521 + - - -0.010164582247014432 + - 0.5254917836303269 + - -0.11728939959987111 + - 0.031401166283109405 + - 0.202952049786492 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.7612288939582822 + - 0.22011088454870795 + - -0.6930292890564576 + - 0.24515979935539478 + - -0.9119932094656207 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.12083338973169744 + - 0.12359911898435172 + - 0.11847294748624924 + - 0.1204604519504766 + - 0.07610319945201176 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.12870200352732564 + - -0.10389868985844915 + - -0.37501879915699127 + - -0.18541690943539932 + - -0.04702771493728981 + - - -0.28377397781017044 + - 0.04631072135573396 + - 0.3373706928254973 + - 0.053062537153292455 + - -0.2800937779745926 + - - -0.15595871887877247 + - 0.5560575834005833 + - -0.027504448094158956 + - 0.1068959101261423 + - -0.04916392093285025 + - - 0.7159719256460106 + - 0.4405997085081062 + - -0.7393022855683045 + - 0.32721085056544846 + - 0.4379543738536064 + - - -0.16927349569863864 + - -0.06948480276565093 + - -0.059155283940860406 + - 0.22445565063495596 + - 0.24290367853391648 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.268423528320119 + - -0.13946633307874465 + - -0.7993169599497402 + - 1.8957665864366233 + - 0.830006098693181 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.08137930994046798 + - 0.09111025159099423 + - 0.12083475394061953 + - 0.12136745805960235 + - 0.12132465520083764 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.1198813779466343 + - 0.07320296304118168 + - 0.23796678982452435 + - 0.0667895312516395 + - 0.10427067882701904 + - - 0.08373108216057079 + - -0.1780521559772933 + - 0.05778911769623431 + - -0.3942187090319752 + - 0.19806462779250142 + - - 0.2171199847078245 + - -0.11237105080550389 + - 0.46886249866228147 + - 0.21442756872773663 + - 0.014044661093248303 + - - -0.49713589716071865 + - 0.27064695337075706 + - -0.2772472406473757 + - -0.42266647999572204 + - -0.19290646520604507 + - - 0.13360533303184338 + - 0.46104850502457395 + - 0.02001739740431832 + - -0.08158918138208685 + - 0.3628296701734589 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9728956257191301 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.23602425791819237 + - - 0.1825842903969548 + - - -0.1141469354572199 + - - 0.11064695516945687 + - - 0.6363405008198829 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + neuron: + - 5 + - 5 + - 5 + out_dim: 1 + precision: default + resnet_dt: true + ntypes: 2 + neuron: + - 5 + - 5 + - 5 + ntypes: 2 + numb_aparam: 0 + numb_fparam: 0 + precision: default + rcond: null + resnet_dt: true + spin: null + tot_ener_zero: false + trainable: + - true + - true + - true + - true + type: ener + type_map: + - O + - H + use_aparam_as_mask: false + var_name: energy + pair_exclude_types: [] + preset_out_bias: null + rcond: null + type: standard + type_map: + - O + - H +model_def_script: + atom_exclude_types: [] + data_bias_nsample: 10 + data_stat_nbatch: 10 + data_stat_protect: 0.01 + descriptor: + add_tebd_to_repinit_out: false + concat_output_tebd: true + env_protection: 0.0 + exclude_types: [] + precision: default + repformer: + activation_function: tanh + attn1_hidden: 5 + attn1_nhead: 4 + attn2_has_gate: true + attn2_hidden: 5 + attn2_nhead: 4 + axis_neuron: 4 + direct_dist: false + g1_dim: 5 + g1_out_conv: true + g1_out_mlp: true + g2_dim: 5 + ln_eps: null + nlayers: 3 + nsel: 40 + rcut: 4.0 + rcut_smth: 3.5 + set_davg_zero: true + trainable_ln: true + update_g1_has_attn: false + update_g1_has_conv: true + update_g1_has_drrd: true + update_g1_has_grrg: true + update_g2_has_attn: false + update_g2_has_g1g1: false + update_h2: false + update_residual: 0.01 + update_residual_init: norm + update_style: res_residual + use_sqrt_nnei: true + repinit: + activation_function: tanh + axis_neuron: 5 + neuron: + - 5 + - 5 + - 5 + nsel: 108 + rcut: 6.0 + rcut_smth: 0.5 + resnet_dt: false + set_davg_zero: true + tebd_dim: 8 + tebd_input_mode: concat + three_body_neuron: + - 2 + - 4 + - 8 + three_body_rcut: 4.0 + three_body_rcut_smth: 3.5 + three_body_sel: 40 + type_one_side: false + use_three_body: true + smooth: true + trainable: true + type: dpa2 + use_econf_tebd: false + use_tebd_bias: false + fitting_net: + activation_function: tanh + atom_ener: [] + neuron: + - 5 + - 5 + - 5 + numb_aparam: 0 + numb_fparam: 0 + precision: default + rcond: null + resnet_dt: true + seed: 1 + trainable: true + type: ener + use_aparam_as_mask: false + pair_exclude_types: [] + preset_out_bias: null + srtab_add_bias: true + type: standard + type_map: + - O + - H +pt_version: 2.5.0+cu124 +software: deepmd-kit +time: "2024-11-12 20:55:56.133493+00:00" +version: 3.0.0b5.dev48+gd46d5f0b7.d20241025 diff --git a/source/tests/infer/deeppot_sea.yaml b/source/tests/infer/deeppot_sea.yaml new file mode 100644 index 0000000000..f51e0cdc0d --- /dev/null +++ b/source/tests/infer/deeppot_sea.yaml @@ -0,0 +1,3975 @@ +"@variables": {} +backend: PyTorch +model: + "@class": Model + "@variables": + out_bias: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.0 + - - 0.0 + out_std: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 1.0 + - - 1.0 + "@version": 2 + atom_exclude_types: [] + descriptor: + "@class": Descriptor + "@variables": + davg: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - 0.05033023990415701 + - 0.0 + - 0.0 + - 0.0 + - - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + - - 0.04810435854572292 + - 0.0 + - 0.0 + - 0.0 + dstd: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - 0.13983584883542127 + - 0.08580324224912261 + - 0.08580324224912261 + - 0.08580324224912261 + - - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + - - 0.12387506031307452 + - 0.0767222430740185 + - 0.0767222430740185 + - 0.0767222430740185 + "@version": 2 + activation_function: tanh + axis_neuron: 2 + embeddings: + "@class": NetworkCollection + "@version": 1 + ndim: 1 + network_type: embedding_network + networks: + - "@class": EmbeddingNetwork + "@version": 2 + activation_function: tanh + bias: true + in_dim: 1 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9135780953141011 + - -0.21988704992411853 + - -0.4665052129042189 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.4480607783689787 + - -0.8184588710236892 + - -0.3212229262177685 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.08271688634770508 + - 0.5710172961098444 + - -0.3386457716744601 + - -2.5417164583577074 + - -0.7193287459119063 + - 0.7652256530675483 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.019875525969363945 + - 0.35820662383392005 + - -0.03324304377423504 + - 0.27688221097732024 + - -0.24989229837693086 + - 0.0783270796917456 + - - 0.20945742957428046 + - -0.211872271466121 + - 0.0008358507886423699 + - -0.05453596666424369 + - 0.39210040951537417 + - -0.3419570224964847 + - - 0.1653069701250396 + - -0.44312835436502285 + - -0.05373650575797951 + - -0.19747867430009755 + - 0.38126230712956843 + - 0.5052052142698005 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9648211602390828 + - -0.7329251669015443 + - 1.9627035817615672 + - -1.3461633369429176 + - 1.0936693885979498 + - 1.3607024848954599 + - 0.8334459935068284 + - -1.8810072976327308 + - -1.1989114806542243 + - 1.4281403830794184 + - -1.3843058263856687 + - -0.052672020574027804 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.47249502253413767 + - 0.12647502337259248 + - -0.06699924946784985 + - -0.09423315846872603 + - 0.5333188515820263 + - -0.1727275917320159 + - 0.09597175344674748 + - -0.005932492557303448 + - -0.11177655892814739 + - -0.3658612150653396 + - 0.0900624080089449 + - 0.3087569242518805 + - - -0.3531998974784297 + - -0.016843749414359895 + - -0.3978187976699206 + - 0.09613768242432623 + - 0.038704464021698956 + - 0.2121530086788622 + - -0.17793330160589513 + - -0.01613256387026088 + - -0.18276498936872523 + - -0.3375118318769777 + - -0.015101439735200641 + - -0.2428858281631755 + - - -0.3856297271047689 + - 0.34124658239474304 + - -0.019121537646152507 + - -0.2957945097641662 + - 0.3338945897757846 + - -0.11131338121737373 + - 0.4990860582585273 + - 0.18017764178170176 + - 0.12372129206846949 + - -0.0053360180956128446 + - -0.1427637886528732 + - 0.17922837261556487 + - - 0.01826665666023047 + - -0.31470232462679454 + - -0.10194269104342851 + - 0.140105295020757 + - 0.20718071908235003 + - -0.18636425764042444 + - 0.22150662118375927 + - -0.44467695847359695 + - 0.19376190244147914 + - 0.3744529008877187 + - 0.187347523462222 + - 0.24725889785262806 + - - -0.05569133835982222 + - 0.4056690684281682 + - -0.4050124133142187 + - 0.06911914042311589 + - -0.02507250287261658 + - 0.12447300353713507 + - -0.08866881586874285 + - 0.09787093395803924 + - -0.5732585744778257 + - 0.3127186256273779 + - -0.04216391443940198 + - 0.14144785545496388 + - - 0.06883848922135298 + - -0.1953127184316002 + - 0.016320845694316112 + - -0.17358161953878057 + - -0.27455717485484615 + - 0.237686322099333 + - 0.003476977953736387 + - -0.5070084729698298 + - -0.09432938135450629 + - -0.01422933742930722 + - 0.06222538657948485 + - 0.2710869470606886 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + neuron: + - 3 + - 6 + - 12 + precision: float64 + resnet_dt: false + - "@class": EmbeddingNetwork + "@version": 2 + activation_function: tanh + bias: true + in_dim: 1 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.42401411440600284 + - 0.9335508956852949 + - 1.2815073047858874 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.02969569009440913 + - -1.0118009942211346 + - 0.06896408835119755 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.45914204107700757 + - 0.11575034881349684 + - 2.042472615214458 + - -0.04460101257497492 + - -0.09496399374159296 + - -0.02778538768440204 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.7035503395434383 + - 0.14786570627009207 + - -0.38542169764931816 + - 0.20612207919736217 + - -0.2061862442776192 + - 0.24707340883641274 + - - -0.35356238326930606 + - -0.4611521817765432 + - 0.058136587416921855 + - 0.4183052227368231 + - -0.16602218293244755 + - -0.0786167186136645 + - - 0.19848155121056013 + - 0.3739182045960408 + - -0.25545938052117345 + - -0.18953224983729802 + - -0.41858486773276415 + - -0.3770657866346729 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.3691793459040411 + - -1.4655414502333097 + - -1.6050232638930426 + - -0.6681646046581292 + - -0.3140923743196441 + - 0.3343664152287671 + - -0.24004830128184454 + - -0.4732990868654677 + - -0.32975769383273484 + - 0.6314644563710302 + - 2.1358167277049422 + - 0.6117069749191495 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.14563116173349283 + - 0.04829045319671905 + - 0.07994197920232828 + - -0.23860016370960932 + - 0.04963336794016981 + - 0.3068430990490502 + - 0.01936056893300573 + - -0.3550040917950255 + - -0.21780471274370697 + - 0.264292708909017 + - 0.5059605396244347 + - -0.07740470349959563 + - - -0.09592344803557039 + - 0.14557821903298793 + - 0.07125651278685914 + - 0.008116574101943882 + - -0.11727715174998957 + - 0.11448630070265027 + - 0.09347138153544679 + - -0.24422598023495334 + - -0.04354907253714727 + - -0.13208668521533803 + - 0.008239117976368397 + - 0.034859296288528165 + - - -0.3631037056379459 + - 0.1978243087998284 + - -0.049890357214265546 + - 0.2963972390728509 + - 0.013778872768427486 + - 0.08639903620572627 + - -0.008822281966412574 + - 0.2933178206949785 + - -0.08230554347102534 + - -0.05800263712621382 + - 0.08577681436425053 + - -0.166578601938574 + - - 0.37022110375622513 + - 0.28402854017517876 + - 0.3418359729210835 + - -0.20230643070146162 + - -0.2111416939858313 + - -0.15959751348169024 + - 0.04722110963098123 + - 0.15879411283730685 + - 0.1556805204442205 + - 0.19973471060846398 + - -0.1302345558079619 + - 0.35036032507149595 + - - 0.22368587041266697 + - -0.11532135231064344 + - -0.03134221053922798 + - -0.10236704897227157 + - -0.19255680351960777 + - 0.0925144003206949 + - -0.1027075690403189 + - 0.31624210244063766 + - -0.043468953265288414 + - 0.4041294754912617 + - -0.2828764908196377 + - -0.31702892676419375 + - - -0.2574112780622649 + - -0.19937051087385846 + - 0.12304523584653093 + - -0.45599474001808815 + - -0.13757553285321772 + - 0.15271930575698398 + - 0.1160045218588379 + - -0.007113074597327396 + - -0.1376347835486681 + - -0.5184472929334725 + - -0.2921898733184288 + - -0.6940203486091138 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + neuron: + - 3 + - 6 + - 12 + precision: float64 + resnet_dt: false + ntypes: 2 + env_mat: + rcut: 6.0 + rcut_smth: 0.5 + env_protection: 0.0 + exclude_types: [] + neuron: + - 3 + - 6 + - 12 + precision: float64 + rcut: 6.0 + rcut_smth: 0.5 + resnet_dt: false + sel: + - 46 + - 92 + set_davg_zero: false + spin: null + trainable: true + type: se_e2_a + type_map: + - O + - H + type_one_side: true + fitting: + "@class": Fitting + "@variables": + aparam_avg: null + aparam_inv_std: null + bias_atom_e: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -93.57372029622398 + - - -187.14744059244796 + fparam_avg: null + fparam_inv_std: null + "@version": 2 + activation_function: tanh + atom_ener: null + dim_descrpt: 24 + dim_out: 1 + exclude_types: [] + layer_name: null + mixed_types: false + nets: + "@class": NetworkCollection + "@version": 1 + ndim: 1 + network_type: fitting_network + networks: + - "@class": FittingNetwork + "@version": 1 + activation_function: tanh + bias_out: true + in_dim: 24 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9981537200365072 + - -1.315191620198832 + - 0.6369789163922976 + - 1.337158860758462 + - -0.9472125858788953 + - -0.6323336917857305 + - -0.00672112112193493 + - 0.550266797507348 + - -0.7859665327566713 + - 0.9559627789152517 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.0042052253448055035 + - 0.0012790546447848106 + - 0.024459922240004015 + - -0.08938464488474171 + - 0.09579565174216789 + - 0.06359047895799255 + - -0.23858555445678956 + - 0.24574716961976314 + - -0.30148053467596875 + - 0.018318522349898603 + - - 0.13428259692815644 + - 0.02493265251926957 + - 0.2121507005915962 + - 0.26295247288893503 + - 0.1431369868225353 + - 0.24016486486115748 + - 0.01699816451436643 + - 0.09133735203040197 + - -0.29745245083276833 + - 0.056392950181727595 + - - -0.2802586118952235 + - -0.1316082125599456 + - 0.2632040292764991 + - 0.11419401800523367 + - 0.2607000737789437 + - 0.11963076327749202 + - -0.20127652325886658 + - 0.3165101919991174 + - -0.038561905875380734 + - -0.0042471663599128115 + - - 0.1635954491570036 + - 0.03590994868003968 + - -0.21038601686901315 + - -0.14028713956327443 + - 0.07567915811764823 + - -0.03368584094543363 + - -0.21812728000462345 + - 0.23355325490724416 + - -0.056981076241320164 + - 0.08885470630211721 + - - -0.0039599483516003075 + - -0.09200095301889753 + - -0.12235481385358529 + - -0.17658616519785011 + - -0.05859356694366821 + - 0.06997022727882568 + - -0.18718983767065284 + - 0.2546703433218559 + - -0.013893634233231148 + - 0.14028529992874594 + - - -0.09860275843967325 + - -0.08940099797057129 + - 0.08290195726553863 + - 0.2651291904246647 + - -0.0810781079200689 + - -0.26944309498149577 + - -0.06398119285959505 + - -0.0824025975377168 + - 0.1517972454111715 + - 0.15972842705634308 + - - -0.0689818055157703 + - -0.2472544578106405 + - 0.20391933074516952 + - -0.3384475880777855 + - 0.024170530156081366 + - 0.12082177662274075 + - -0.03015793325701928 + - 0.26097457806906477 + - 0.13234544720128233 + - 0.10969962380216029 + - - -0.1410236369792598 + - 0.2565220565743628 + - -0.09813900782449475 + - -0.16475308162821475 + - -0.4382269634184545 + - -0.09618619130856115 + - -0.06151773086475732 + - -0.3679955124060774 + - 0.09489492151931028 + - 0.1699636112301434 + - - -0.06466507122698881 + - -0.03399661756182682 + - -0.08465867612319165 + - -0.02820143776252954 + - -0.04364607418496975 + - 0.10649423660304615 + - 0.1117641236592904 + - 0.242076918802004 + - 0.23336414341736533 + - -0.10973931654443178 + - - -0.11803473383837482 + - 0.26023291747567073 + - -0.036576563288649645 + - 0.031801452475671496 + - 0.027499520410698055 + - 0.21832021718409408 + - 0.002563705598485124 + - -0.023939863087569735 + - -0.15508788279340086 + - -0.009958330239924398 + - - 0.2029037816897343 + - 0.1236798701169301 + - -0.09018519532479251 + - 0.10235830736281337 + - 0.22210742529901917 + - -0.11510008731097023 + - -0.2907045465491179 + - 0.19173281505129286 + - -0.1826620176135373 + - -0.3858276132763665 + - - 0.25873945816211946 + - 0.20526926855225042 + - -0.1946447069870335 + - 0.0920127246001931 + - 0.18416151105208917 + - 0.13335997520924525 + - 0.11244062601373198 + - 0.006020269240571531 + - 0.22885110139445944 + - -0.24802252929895452 + - - 0.18188964884594755 + - 0.09757316104582281 + - 0.21451544724583474 + - -0.03795113704629376 + - 0.23089932965728366 + - -0.1653256730851483 + - 0.05472418048709738 + - -0.03607142063053913 + - -0.12208110627218638 + - -0.05489922891341493 + - - 0.003967605563087107 + - 0.09393663928648069 + - -0.07443910754909523 + - 0.07398359030793977 + - -0.09616706889032565 + - 0.04408314592707753 + - -0.027688682986298615 + - -0.3893989079960798 + - -0.019583475709650577 + - 0.15263602009279958 + - - 0.23242566280078358 + - -0.20751154943785288 + - -0.1057531593975858 + - 0.0097666599925194 + - 0.01723815124684891 + - -0.14321076447143907 + - -0.05668897839878534 + - 0.4076712003422085 + - -0.12968800173163939 + - -0.11833504008442321 + - - -0.0382870843112316 + - 0.1923434843810583 + - 0.18933356350887878 + - 0.1935721875785095 + - 0.1040048511477642 + - 0.2018770661645953 + - -0.007807146975480021 + - -0.0007246459780983533 + - -0.15092810563793607 + - -0.1266003232191877 + - - 0.14101405179181745 + - 0.07251429705927144 + - -0.009029755426231204 + - -0.030652737781312292 + - 0.028970459200312354 + - -0.06279658944669542 + - -0.16561866479726714 + - 0.10135625033764951 + - 0.20076140517783675 + - 0.18808803566465912 + - - -0.062259847002018434 + - 0.16140409497962688 + - -0.047263255762838075 + - 0.02161784552788213 + - -0.34189275457722157 + - 0.23624471783983889 + - -0.07604339720459162 + - 0.11972193795451776 + - 0.008718648262089578 + - -0.14597435103721404 + - - -0.14629679080173855 + - -0.010059437004151458 + - 0.12313644848963382 + - 0.07363202275050783 + - 0.3158951551063782 + - 0.30872396959636816 + - 0.11068402170384259 + - 0.13798118511411697 + - -0.17580561411126133 + - 0.2309366660573632 + - - 0.24607121569674878 + - 0.04633671294658672 + - -0.07794643734438188 + - 0.2637145614710995 + - 0.1673610762049212 + - -0.050889657349376165 + - 0.08082949413787617 + - 0.24349734338054974 + - -0.22618034164526177 + - -0.2699847668276845 + - - -0.0930135234346539 + - 0.11048617654242995 + - -0.10055237297539021 + - 0.2114601268899422 + - -0.08746970446094664 + - -0.16504052170679984 + - 0.11382627278043715 + - 0.3029957109835582 + - -0.011668717315770452 + - -0.191775672823171 + - - -0.23450812115563055 + - -0.009067565673813316 + - 0.07750402173739522 + - 0.07176706287311344 + - 0.11641190944846258 + - -0.1357712681870809 + - -0.18494204455539703 + - 0.11317724042565168 + - 0.20294076058173613 + - 0.2652756944904472 + - - -0.05606948494123854 + - 0.07125608415284536 + - 0.21786208482337216 + - 0.06403079423538505 + - -0.023569537627091536 + - -0.08670783596141193 + - -0.06814400771010572 + - 0.16076713468366743 + - 0.05133570956677264 + - 0.04802388700136072 + - - 0.07703357030277777 + - 0.049584559880658324 + - 0.31461230774136195 + - -0.13778140662267765 + - 0.2840242396477052 + - 0.03509103879961169 + - 0.3406341956660782 + - -0.09133539705008382 + - -0.07324504845041965 + - 0.09846652096261795 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.6163330784017647 + - -1.770660783796408 + - 0.5161258405142825 + - -0.1612283658165593 + - -0.7523557826606485 + - -2.224214510392427 + - -0.33342190547093487 + - -1.126722365560626 + - -0.4720938937079637 + - 1.3963705617158102 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.11119561540931056 + - 0.08970452515484859 + - 0.08915193432675515 + - 0.09048898647907772 + - 0.11061185348485504 + - 0.08865526034423891 + - 0.10991823920411607 + - 0.08882526076676668 + - 0.11002293261542401 + - 0.10972840025346457 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.3296701598540796 + - 0.2296310333592966 + - 0.12856996740720156 + - -0.2899652443366801 + - -0.30948078796262024 + - -0.03584087926405295 + - -0.17713330810709904 + - -0.028899062709869576 + - 0.1701000953073888 + - -0.1455204576271593 + - - -0.058465655159713324 + - 0.025638712945035648 + - -0.11357307412441271 + - -0.022422611999286395 + - -0.0638233851458305 + - -0.17943732395298106 + - -0.35728668924171725 + - 0.2633856900982372 + - 0.31930240317937025 + - -0.13942155663674075 + - - 0.25925030472898564 + - -0.08600915200889982 + - 0.013237271542377893 + - 0.08270645093988137 + - 0.07938652623724432 + - -0.07712393546328064 + - 0.0353061287875199 + - -0.09040033388673825 + - -0.10510751746845258 + - -0.239521654551994 + - - 0.1950191665752893 + - 0.05733138609046635 + - 0.06036323899411715 + - 0.08603163367369916 + - -0.06351003379199475 + - -0.11695534727101047 + - -0.29962219683967695 + - -0.16592572533204622 + - 0.04512989503642938 + - -0.5426376699838075 + - - -0.16145358850836278 + - 0.1472987868317316 + - -0.1685368576975565 + - 0.1486279679321272 + - 0.4495215217544417 + - 0.11479724794417837 + - -0.16865830590287098 + - -0.06396524972992296 + - 0.11824420098274822 + - -0.3484497284909885 + - - -0.13690561062125733 + - -0.13492860372177048 + - 0.35633010151792976 + - 0.12420350039852161 + - -0.13175470708945922 + - 0.05482431376078837 + - 0.029804708140519526 + - -0.06731920990649255 + - 0.18110006421406621 + - -0.03754748826767218 + - - 0.12325162433762646 + - -0.06526178999491541 + - 0.02939936255381139 + - 0.14462063711735892 + - -0.1315751283801704 + - 0.021863822341382386 + - 0.11981563675784059 + - 0.03806003514789598 + - -0.004355114224454414 + - -0.11544599826628787 + - - 0.2604909324088583 + - 0.21536103820459426 + - -0.121929486161253 + - -0.2582532715867142 + - -0.1627398924375832 + - -0.18123721122539346 + - -0.1803681902724512 + - -0.247559536889046 + - -0.2506988345912087 + - -0.012069856489839355 + - - 0.03898964086288465 + - 0.03094500722331738 + - -0.38373964405311967 + - -0.0705277215507272 + - 0.1177653852310158 + - -0.1105579483799866 + - -0.19736589071870414 + - 0.11345784613887841 + - 0.08554759880845628 + - 0.25028576336592095 + - - -0.38439612321931316 + - 0.4083379401980623 + - 0.02577391248413277 + - 0.3357676686485732 + - 0.15595467768056223 + - 0.24350752960431812 + - -0.331118357474186 + - 0.026624072250718868 + - 0.0469741762786187 + - 0.1417201508528421 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.2443577621260153 + - 0.624131229202312 + - -0.0058782517543746185 + - 0.1006152125408876 + - 0.7079714568863247 + - 0.09603584514823546 + - -0.6583908819630836 + - 1.6357423422817616 + - -0.0618699131255024 + - 0.4326396377925964 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.10967226479267887 + - 0.11114996160896161 + - 0.09000111259693142 + - 0.10890636464120326 + - 0.0883775382571271 + - 0.09102278408813357 + - 0.11021326614143533 + - 0.1098526664530503 + - 0.08886435538847728 + - 0.11066158832294501 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.17618485260708863 + - 0.045662247265226524 + - -0.5499256594329442 + - 0.34921229907826634 + - -0.04998263541098386 + - 0.02885288947399967 + - -0.036935148275496446 + - 0.03168683104426859 + - -0.18333941288288597 + - -0.2877694783301828 + - - 0.30086376971246415 + - -0.16704806261539829 + - -0.02718284690086246 + - 0.3540665247754029 + - -0.47316920072321395 + - 0.17479351669434584 + - 0.2222871117126889 + - -0.04083715524524929 + - -0.09965086611311093 + - -0.25783386657611146 + - - 0.026827655453065244 + - -0.09119899103973973 + - 0.019197115436614908 + - 0.1507771055095364 + - -0.21686370675957115 + - -0.08131250420897763 + - -0.04988204840585801 + - 0.0874730513357209 + - 0.23496968515864666 + - -0.26002029020484513 + - - -0.021338944609839042 + - 0.09905589528721442 + - 0.41041040462733797 + - -0.0533099757907697 + - -0.021340758072178192 + - 0.3166872698691298 + - -0.15138364509791633 + - 0.11433952007507375 + - 0.02953263811461213 + - -0.013537413535656817 + - - 0.3009126159955464 + - 0.1954788190243878 + - 0.21111462027375286 + - -0.19605908878211573 + - 0.04831200653374466 + - 0.3456478755867381 + - 0.1844910166298473 + - 0.4334051763004547 + - -0.11278043986647618 + - 0.0029415936287763853 + - - 0.4131691255165403 + - 0.008090227469773597 + - 0.02601770026739277 + - 0.057518289846918556 + - 0.045924119256435546 + - -0.1639339084346573 + - -0.016992038540731294 + - 0.39067897412791813 + - -0.15408600681685158 + - -0.3682538203037312 + - - -0.12391815059857987 + - 0.20270400475705594 + - 0.05799313895689829 + - -0.13403630322954838 + - -0.02240264202173418 + - 0.04562362082331838 + - 0.5614711146060805 + - -0.11039776332473819 + - 0.2691093146500228 + - -0.06570941118786719 + - - -0.4507256649511681 + - 0.012534253590173329 + - 0.02695666344894358 + - -0.24904640409426215 + - -0.031153981418388346 + - -0.5520342779112677 + - -0.033871400211516405 + - 0.15977107583011851 + - 0.039250575027518594 + - 0.10224610487637376 + - - 0.19048716887591094 + - 0.3354937447407981 + - 0.14225222638765445 + - 0.1779119193457957 + - 0.1563110490437229 + - -0.10540873992351772 + - -0.19084132513916224 + - 0.13029029243756504 + - 0.22645260563443315 + - 0.02354655421863742 + - - 0.4944264160553193 + - -0.21930927535519323 + - -0.2530454534409796 + - 0.011598014978998455 + - 0.0841671191792054 + - 0.10389936624580148 + - 0.10109843311103231 + - 0.30195061372635124 + - -0.17459900475580292 + - 0.15902741038759083 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.3888875707253524 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.011842172174146248 + - - -0.10595673764230339 + - - 0.6574265076935244 + - - 0.07000937566890184 + - - 0.1337010097188838 + - - -0.18983960016519466 + - - 0.39772644612916264 + - - -0.052834839876726186 + - - 0.050494269297535775 + - - -0.36970159517523593 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + neuron: + - 10 + - 10 + - 10 + out_dim: 1 + precision: float64 + resnet_dt: true + - "@class": FittingNetwork + "@version": 1 + activation_function: tanh + bias_out: true + in_dim: 24 + layers: + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.9000215275312623 + - -0.7227983960332327 + - 1.321515394024242 + - -1.0068830901074755 + - 0.8067888775589227 + - 0.5259057745703067 + - -1.0576301719828265 + - 0.07108081373858936 + - -0.18919061094060166 + - -0.8438625943799956 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.2639494686727459 + - 0.010256088113037042 + - 0.10252432422254726 + - 0.1358424628723544 + - -0.06740107220848378 + - 0.2483353972875281 + - 0.1283761651669193 + - -0.15185866988889724 + - -0.010024301844827593 + - 0.03270748203887378 + - - -0.24135443878774207 + - 0.06680607543652448 + - -0.20526105984848583 + - -0.08170985489575135 + - -0.014980349046510608 + - -0.12251724207605148 + - -0.33215839642502065 + - -0.0893955914470478 + - 0.09685445903892786 + - -0.017194770138568405 + - - -0.15723278542924113 + - 0.3044613549688298 + - 0.019364461806932475 + - 0.06021115227209433 + - 0.14496091559550034 + - 0.07508084172243198 + - -0.0877602205085306 + - 0.07182335283162082 + - 0.035870017932231726 + - 0.38929526764814876 + - - 0.16203882562124738 + - -0.006541279986094555 + - 0.06663819764767388 + - 0.034230902521745404 + - 0.23042498769919634 + - -0.099609321017009 + - -0.5115848193328142 + - -0.10943344489952037 + - 0.09052949992901997 + - -0.09867770244150034 + - - -0.16792948505177765 + - -0.10141216787820605 + - 0.04509922259178674 + - 0.01834823651662897 + - -0.0947941363957327 + - 0.011585898708337426 + - -0.22242196389762037 + - -0.02906434835708795 + - 0.035931171395247034 + - -0.1551391234188593 + - - -0.11776430983031586 + - 0.16368543523909046 + - -0.03382559903040933 + - -0.10158099352181799 + - 0.04226584034972191 + - -0.2800772224818269 + - -0.1107114178030891 + - -0.20171969920755975 + - 0.018747187046783933 + - -0.1956648548513648 + - - -0.009540451682665336 + - -0.04322394377916856 + - 0.05711019844711882 + - -0.17375929192144648 + - 0.08809681311993994 + - -0.05280096463310341 + - -0.16431224282159823 + - -0.166866126039713 + - -0.17435131036511972 + - 0.22597287533447752 + - - 0.0507339892429798 + - 0.09579538728179318 + - 0.038039862708474176 + - 0.0028466082820301723 + - -0.05651059197513672 + - -0.10098375458059926 + - -0.1571779231828787 + - 0.02384123879165128 + - -0.049876844658735084 + - 0.04523498526212328 + - - -0.4447121005124451 + - 0.25891242331505243 + - -0.08492103152745828 + - -0.026516847851845854 + - -0.27500865889520304 + - -0.1352245901963451 + - -0.2816293054397084 + - -0.26771014483176436 + - 0.0394212322338621 + - -0.10990601907118915 + - - -0.27635148046036195 + - -0.0751644443246153 + - 0.04675683081585847 + - -0.2402155597668226 + - -0.1430883558338466 + - 0.123899488905589 + - 0.025577533316584806 + - -0.09807864897434167 + - 0.09903175267746918 + - 0.0684929646793837 + - - -0.12679113232734612 + - 0.016568913234529754 + - -0.04587053800138196 + - 0.011498746771685862 + - -0.17994957845492482 + - 0.09845997049967746 + - -0.17032015097430434 + - 0.09096849426272227 + - -0.18366375790865738 + - -0.01270384812610915 + - - -0.2690129610756614 + - -0.058612835837374276 + - -0.10810671748420293 + - -0.12975485588268149 + - -0.2505978093628489 + - -0.101708409209403 + - 0.18612170716022863 + - 0.29354112140454053 + - 0.1640974741755058 + - -0.21399285226775538 + - - 0.014432650198421848 + - 0.12990120625924478 + - 0.12467157085766334 + - 0.12443424527019636 + - -0.03672542117823035 + - -0.11479058801452288 + - -0.007680294256678681 + - -0.2929250704773807 + - -0.08020608845647081 + - 0.11582168938812817 + - - 0.11728584361060512 + - -0.10601859600331497 + - 0.002794232973850923 + - 0.1627873351259995 + - -0.025293428980551407 + - -0.11724616652140807 + - -0.22680671870617725 + - 0.1099539565411639 + - 0.1776642924177351 + - 0.10371783226753746 + - - 0.3056032976023567 + - -0.3665719924864891 + - 0.08653537156898466 + - 0.0609487406692957 + - 0.13764575247447544 + - 0.16073262532054974 + - 0.11250966014845575 + - 0.02753441289238271 + - -0.015872675462566162 + - 0.10351056173414053 + - - -0.05017533401353259 + - -0.07384519749788616 + - -0.17614423543644447 + - -0.09663927227023622 + - -0.1790259621151453 + - 0.03168735029070646 + - -0.26112613330746653 + - 0.3288292945779274 + - -0.05557832956378767 + - 0.053100216246127895 + - - 0.25194208657331535 + - 0.046802913549916024 + - 0.012827957057808835 + - 0.060730872638830716 + - -0.16661704697368657 + - 0.1784818136494304 + - 0.2819638309602722 + - -0.17565794216032193 + - 0.28692647269535654 + - -0.12885201804513213 + - - -0.14921299976152355 + - -0.15752553954165557 + - 0.04876986997607481 + - -0.1863098849339127 + - 0.09128999377895769 + - 0.008009921667809717 + - -0.3017259463864289 + - -0.3171946274933575 + - 0.10186123663885215 + - -0.4413740947953646 + - - -0.08999848872321205 + - -0.2771120878253297 + - 0.20539242757822895 + - 0.005196131487372434 + - 0.09996012014582731 + - 0.2657724574170448 + - 0.16975588443885592 + - 0.06600840258420763 + - 0.21760144308034488 + - -0.10174231479171901 + - - -0.10630677074119527 + - -0.2025794786472348 + - 0.06086165293497518 + - 0.1521617829360692 + - -0.3400013083716394 + - 0.19892602735923454 + - 0.06371760535565664 + - -0.042456612062881635 + - 0.0608862002079617 + - -0.13855964354657122 + - - 0.07582742023083668 + - -0.12280411037083581 + - -0.2312295729747888 + - 0.09282181630764516 + - -0.11774711035032617 + - -0.31037439415574963 + - -0.19072723466736397 + - 0.13810854925479657 + - 0.06740177744292578 + - -0.23896620577909786 + - - -0.162341629422499 + - 0.04435484266535598 + - 0.12949549440468158 + - -0.16297035472848678 + - 0.08726167365622212 + - 0.04366956611879564 + - -0.027206957390748736 + - 0.1333275950891988 + - -0.2613085150183285 + - -0.20947871852476566 + - - -0.09117864158954347 + - 0.11184338889765945 + - -0.10492660212956549 + - 0.037476509645114925 + - 0.22490240548059126 + - -0.15238707485438738 + - -0.05298925855685219 + - -0.1864744562511453 + - 0.16282101762464754 + - -0.15821562334837078 + - - 0.11064503009817617 + - -0.08129274403273178 + - -0.11562116185307988 + - 0.036873955142837256 + - -0.4232929777513909 + - 0.3379396690789762 + - -0.22790642930236557 + - -0.12393699374270109 + - -0.13795658045985393 + - 0.28580886098129543 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: false + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.38707932767395387 + - -0.342039075676344 + - -0.7605327261659611 + - 0.11960682112234215 + - 0.22877035392822276 + - 1.2538633129456696 + - 0.3451934629791991 + - 0.057223403845354286 + - 0.41432284297592403 + - -1.057538843832911 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.11057731344173005 + - 0.09166489068928595 + - 0.08834237103327737 + - 0.08985530004808084 + - 0.09004106819400194 + - 0.110088004003701 + - 0.1102947353036592 + - 0.11122172956610853 + - 0.11222041413258106 + - 0.10895646062165928 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.22562359760266557 + - 0.6093700510258442 + - -0.3862283030393641 + - 0.13190938086077073 + - 0.16904684054901958 + - 0.34209971229462666 + - 0.21129876725330834 + - -0.2755838784617781 + - -0.00958156785007398 + - -0.0792576938319562 + - - -0.07590864199833239 + - 0.1330950724591729 + - 0.16239841094514196 + - 0.06216113664814958 + - -0.2724028166870573 + - -0.0950820514913243 + - 0.29024492128515733 + - -0.046965745288487834 + - -0.27571817414854705 + - 0.22166174173429865 + - - 0.2035656947004025 + - 0.0031920482731557197 + - -0.42269138021776165 + - 0.2457720240311169 + - -0.3007697984627373 + - -0.2586916704989178 + - 0.011124140548716552 + - 0.28748139157650465 + - -0.07939623462531636 + - -0.142930432028218 + - - 0.18313342574526303 + - -0.10683878239024348 + - 0.169257801643557 + - 0.5262453606874672 + - -0.04879583171885936 + - 0.25763233021925236 + - 0.020272263444042087 + - -0.03904631900691532 + - -0.18716181672868185 + - 0.07230450466148552 + - - -0.30592931443701327 + - -0.1252728151762653 + - 0.11473858127268824 + - -0.06372339464341502 + - -0.14453755741135488 + - 0.2826035720710313 + - -0.19879292892809405 + - 0.006055059682360477 + - -0.2538459959901242 + - 0.10745867501569967 + - - 0.22970647900288899 + - 0.138364153785151 + - -0.07735393462141985 + - 0.07530026753816028 + - 0.07112656939827086 + - -0.2214458770953512 + - -0.4924904487955132 + - -0.1622388614063035 + - -0.197804383645105 + - -0.40774478244528006 + - - -0.17575776197771453 + - 0.12146708364526686 + - -0.034463932487421085 + - 0.1788850492610013 + - -0.05731103348416332 + - 0.06889448330307754 + - 0.24516690736509378 + - 0.3127497159747833 + - -0.030280799327598185 + - 0.09556479648505135 + - - -0.014413020252857104 + - -0.28698490503832147 + - 0.09483994866387635 + - 0.05222910607348386 + - 0.1994789368157623 + - -0.2818741859625111 + - -0.010396515902957145 + - 0.04183557337111259 + - -0.008287492548398551 + - -0.2925052749940528 + - - 0.017256393993720674 + - -0.09336793519057174 + - -0.14184201486390932 + - -0.20290610789388205 + - 0.03808761725237456 + - -0.062149851543097115 + - -0.00864623950442309 + - -0.35021969228968475 + - -0.2052184205698035 + - -0.4436374571930673 + - - 0.05734301760745409 + - -0.03714558201311452 + - -0.4173373754967207 + - -0.08679355824638953 + - -0.07306918814547493 + - 0.19544632145934263 + - 0.497186002866004 + - 0.06458406592447367 + - -0.36548805693881903 + - -0.13124714330887066 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - -0.22997830608154382 + - 0.4435768941487313 + - 0.14303044935320117 + - -1.16577110008048 + - 0.4816720053756091 + - -2.9765647280871423 + - 0.5889251249161973 + - -0.38050218573495515 + - 0.18979171907573328 + - 0.45877476495214425 + idt: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 0.11070143628243294 + - 0.10922602584484076 + - 0.11195094567841188 + - 0.09004675088245527 + - 0.08980017610007925 + - 0.08912480626627803 + - 0.0896492384050733 + - 0.08849818353918305 + - 0.10983521381344624 + - 0.09094846995634104 + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - 0.10108210517328102 + - -0.05232561496473743 + - 0.36668855727973637 + - 0.09257418721057574 + - 0.17191215843944357 + - -0.11483389015076328 + - 0.0656162851585946 + - -0.09176178089980337 + - -0.15664437870164957 + - -0.16346971077648034 + - - 0.02558528376556598 + - 0.5832659444951624 + - -0.37826154374912035 + - -0.2956624104776143 + - 0.08919028399896758 + - 0.15925510299907994 + - 0.28617892614917384 + - -0.1767224311399701 + - -0.3197317172438727 + - 0.3121168642622297 + - - 0.07216872045443962 + - -0.13598929105799168 + - -0.03536008289115259 + - 0.3093828991431095 + - 0.31602137772259464 + - -0.18710495215339262 + - 0.010401609944592771 + - 0.03476012661438127 + - -0.012983716604445061 + - 0.04684740161761361 + - - 0.04247512111775211 + - -0.09371981872684937 + - -0.3663641703790199 + - 0.46223401434724043 + - 0.20247958630383156 + - -0.08317997337403724 + - 0.3634265230232031 + - 0.3458274937618409 + - 0.025543925139465067 + - -0.03106949633698399 + - - 0.040260607731424286 + - 0.009309373996654179 + - 0.10520190131367661 + - 0.11129333178305297 + - -0.12162768486020593 + - -0.12192274836206039 + - 0.11950586018766925 + - 0.2291912405064738 + - -0.10968589986322486 + - -0.29068612133443905 + - - 0.1438823277917827 + - 0.18216007495495068 + - -0.009571238259658254 + - 0.16707448786759976 + - -0.04281652925723783 + - 0.32047875873206777 + - -0.08763911799482689 + - -0.1245252648441373 + - 0.46887113009782105 + - -0.19844629125139612 + - - -0.24011562238772022 + - -0.10204798730286967 + - -0.21125021451360748 + - 0.08315306052287015 + - -0.1793580497394702 + - -0.08407247375098266 + - -0.06370754052005728 + - -0.20060326958664665 + - -0.17948953871230516 + - 0.09669298322007468 + - - -0.13343204571646267 + - 0.18008449100797377 + - -0.46816412675017605 + - -0.05507106060832335 + - -0.16700345090023166 + - 0.15508384962457078 + - 0.017734250652154813 + - -0.1550230036549483 + - -0.02628806339568613 + - 0.049337498067655874 + - - 0.02679767080621389 + - 0.12092724481351536 + - 0.23803055650836435 + - 0.2918643383802174 + - -0.0050387329311884395 + - 0.10526966012765887 + - 0.034679495369277794 + - -0.06543260933885439 + - 0.005063852100596086 + - 0.09933328759193807 + - - -0.2777375125368255 + - -0.23070868272286654 + - 0.6108565671340866 + - 0.06073857349664605 + - -0.024130496263620627 + - -0.016698846402277097 + - 0.020472805597523167 + - -0.16180878068639318 + - -0.16084599014917336 + - -0.3314925208838775 + "@version": 1 + activation_function: tanh + bias: true + precision: float64 + resnet: true + use_timestep: true + - "@class": Layer + "@variables": + b: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - 1.1981756305945983 + idt: null + w: + "@class": np.ndarray + "@is_variable": true + "@version": 1 + dtype: float64 + value: + - - -0.38583843326969747 + - - -0.35536303933445884 + - - -0.3982240653639878 + - - -0.06690466423340803 + - - 0.27802346228262165 + - - -0.2061475291897428 + - - 0.28581111357063477 + - - -0.43468045802907607 + - - -0.3247707927028263 + - - 0.09371781830568159 + "@version": 1 + activation_function: none + bias: true + precision: float64 + resnet: false + use_timestep: false + neuron: + - 10 + - 10 + - 10 + out_dim: 1 + precision: float64 + resnet_dt: true + ntypes: 2 + neuron: + - 10 + - 10 + - 10 + ntypes: 2 + numb_aparam: 0 + numb_fparam: 0 + precision: float64 + rcond: null + resnet_dt: true + spin: null + tot_ener_zero: false + trainable: + - true + - true + - true + - true + type: ener + type_map: + - O + - H + use_aparam_as_mask: false + var_name: energy + pair_exclude_types: [] + preset_out_bias: null + rcond: null + type: standard + type_map: + - O + - H +model_def_script: + _comment4: " that's all" + descriptor: + _comment2: " that's all" + axis_neuron: 2 + neuron: + - 3 + - 6 + - 12 + ntypes: 2 + precision: float64 + rcut: 6.0 + rcut_smth: 0.5 + resnet_dt: false + seed: 1 + sel: + - 46 + - 92 + type: se_e2_a + fitting_net: + _comment3: " that's all" + dim_descrpt: 24 + embedding_width: 24 + mixed_types: false + neuron: + - 10 + - 10 + - 10 + ntypes: 2 + precision: float64 + resnet_dt: true + seed: 1 + type: ener + resuming: true + type_map: + - O + - H +pt_version: 2.5.0+cu124 +software: deepmd-kit +time: "2024-11-12 20:54:08.623904+00:00" +version: 3.0.0b5.dev48+gd46d5f0b7.d20241025 From 47b76c890f7ca37a33c1e47dfb6f3848214aa4d2 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Wed, 13 Nov 2024 22:37:08 +0800 Subject: [PATCH 3/3] fix(pt): fix precision (#4344) Tried to implement the decorator as in #4343, but encountered JIT errors. ## Summary by CodeRabbit ## Release Notes - **New Features** - Enhanced precision handling across various descriptor classes and methods, ensuring consistent tensor operations. - Updated output formats in several classes to improve clarity and usability. - Introduced a new environment variable for stricter control over tensor precision handling. - Added a new parameter to the `DipoleFittingNet` class for excluding specific types. - **Bug Fixes** - Removed conditions that skipped tests for "float32" data type, allowing all tests to run consistently. - **Documentation** - Improved error messages for dimension mismatches and unsupported parameters, enhancing user understanding. - **Tests** - Adjusted test parameters for consistency in handling `fparam` and `aparam` across multiple test cases. - Simplified tensor handling in tests by removing unnecessary type conversions before compression. --- deepmd/pt/model/descriptor/dpa1.py | 12 +++++++++- deepmd/pt/model/descriptor/dpa2.py | 15 +++++++++++- deepmd/pt/model/descriptor/repformers.py | 12 +++++----- deepmd/pt/model/descriptor/se_a.py | 19 +++++++++++---- deepmd/pt/model/descriptor/se_atten.py | 10 ++------ deepmd/pt/model/descriptor/se_r.py | 5 ++-- deepmd/pt/model/descriptor/se_t.py | 19 +++++++++++---- deepmd/pt/model/descriptor/se_t_tebd.py | 23 +++++++++++------- deepmd/pt/model/network/mlp.py | 6 +++-- deepmd/pt/model/task/dipole.py | 2 ++ deepmd/pt/model/task/fitting.py | 24 ++++++++++++------- deepmd/pt/model/task/invar_fitting.py | 5 +++- deepmd/pt/model/task/polarizability.py | 5 +++- deepmd/pt/utils/env.py | 1 + .../model/test_compressed_descriptor_dpa2.py | 5 ---- .../test_compressed_descriptor_se_atten.py | 5 ---- source/tests/pt/model/test_dipole_fitting.py | 4 ++-- .../pt/model/test_polarizability_fitting.py | 2 +- .../tests/pt/model/test_property_fitting.py | 4 ++-- 19 files changed, 114 insertions(+), 64 deletions(-) diff --git a/deepmd/pt/model/descriptor/dpa1.py b/deepmd/pt/model/descriptor/dpa1.py index 76115b2810..b541e665ab 100644 --- a/deepmd/pt/model/descriptor/dpa1.py +++ b/deepmd/pt/model/descriptor/dpa1.py @@ -22,6 +22,7 @@ env, ) from deepmd.pt.utils.env import ( + PRECISION_DICT, RESERVED_PRECISON_DICT, ) from deepmd.pt.utils.tabulate import ( @@ -311,6 +312,7 @@ def __init__( use_tebd_bias=use_tebd_bias, type_map=type_map, ) + self.prec = PRECISION_DICT[precision] self.tebd_dim = tebd_dim self.concat_output_tebd = concat_output_tebd self.trainable = trainable @@ -678,6 +680,8 @@ def forward( The smooth switch function. shape: nf x nloc x nnei """ + # cast the input to internal precsion + extended_coord = extended_coord.to(dtype=self.prec) del mapping nframes, nloc, nnei = nlist.shape nall = extended_coord.view(nframes, -1).shape[1] // 3 @@ -693,7 +697,13 @@ def forward( if self.concat_output_tebd: g1 = torch.cat([g1, g1_inp], dim=-1) - return g1, rot_mat, g2, h2, sw + return ( + g1.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + rot_mat.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + g2.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION) if g2 is not None else None, + h2.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + ) @classmethod def update_sel( diff --git a/deepmd/pt/model/descriptor/dpa2.py b/deepmd/pt/model/descriptor/dpa2.py index 77e9f1d936..3c1db49568 100644 --- a/deepmd/pt/model/descriptor/dpa2.py +++ b/deepmd/pt/model/descriptor/dpa2.py @@ -27,6 +27,9 @@ from deepmd.pt.utils import ( env, ) +from deepmd.pt.utils.env import ( + PRECISION_DICT, +) from deepmd.pt.utils.nlist import ( build_multiple_neighbor_list, get_multiple_nlist_key, @@ -268,6 +271,7 @@ def init_subclass_params(sub_data, sub_class): ) self.concat_output_tebd = concat_output_tebd self.precision = precision + self.prec = PRECISION_DICT[self.precision] self.smooth = smooth self.exclude_types = exclude_types self.env_protection = env_protection @@ -745,6 +749,9 @@ def forward( The smooth switch function. shape: nf x nloc x nnei """ + # cast the input to internal precsion + extended_coord = extended_coord.to(dtype=self.prec) + use_three_body = self.use_three_body nframes, nloc, nnei = nlist.shape nall = extended_coord.view(nframes, -1).shape[1] // 3 @@ -810,7 +817,13 @@ def forward( ) if self.concat_output_tebd: g1 = torch.cat([g1, g1_inp], dim=-1) - return g1, rot_mat, g2, h2, sw + return ( + g1.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + rot_mat.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + g2.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + h2.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + ) @classmethod def update_sel( diff --git a/deepmd/pt/model/descriptor/repformers.py b/deepmd/pt/model/descriptor/repformers.py index bd1109e8b7..d646179fa2 100644 --- a/deepmd/pt/model/descriptor/repformers.py +++ b/deepmd/pt/model/descriptor/repformers.py @@ -22,6 +22,9 @@ from deepmd.pt.utils import ( env, ) +from deepmd.pt.utils.env import ( + PRECISION_DICT, +) from deepmd.pt.utils.env_mat_stat import ( EnvMatStatSe, ) @@ -237,6 +240,7 @@ def __init__( self.reinit_exclude(exclude_types) self.env_protection = env_protection self.precision = precision + self.prec = PRECISION_DICT[precision] self.trainable_ln = trainable_ln self.ln_eps = ln_eps self.epsilon = 1e-4 @@ -286,12 +290,8 @@ def __init__( self.layers = torch.nn.ModuleList(layers) wanted_shape = (self.ntypes, self.nnei, 4) - mean = torch.zeros( - wanted_shape, dtype=env.GLOBAL_PT_FLOAT_PRECISION, device=env.DEVICE - ) - stddev = torch.ones( - wanted_shape, dtype=env.GLOBAL_PT_FLOAT_PRECISION, device=env.DEVICE - ) + mean = torch.zeros(wanted_shape, dtype=self.prec, device=env.DEVICE) + stddev = torch.ones(wanted_shape, dtype=self.prec, device=env.DEVICE) self.register_buffer("mean", mean) self.register_buffer("stddev", stddev) self.stats = None diff --git a/deepmd/pt/model/descriptor/se_a.py b/deepmd/pt/model/descriptor/se_a.py index 9b5ee6d2c4..362447f231 100644 --- a/deepmd/pt/model/descriptor/se_a.py +++ b/deepmd/pt/model/descriptor/se_a.py @@ -118,6 +118,7 @@ def __init__( super().__init__() self.type_map = type_map self.compress = False + self.prec = PRECISION_DICT[precision] self.sea = DescrptBlockSeA( rcut, rcut_smth, @@ -337,7 +338,18 @@ def forward( The smooth switch function. """ - return self.sea.forward(nlist, coord_ext, atype_ext, None, mapping) + # cast the input to internal precsion + coord_ext = coord_ext.to(dtype=self.prec) + g1, rot_mat, g2, h2, sw = self.sea.forward( + nlist, coord_ext, atype_ext, None, mapping + ) + return ( + g1.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + rot_mat.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + None, + None, + sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + ) def set_stat_mean_and_stddev( self, @@ -742,7 +754,6 @@ def forward( ) dmatrix = dmatrix.view(-1, self.nnei, 4) - dmatrix = dmatrix.to(dtype=self.prec) nfnl = dmatrix.shape[0] # pre-allocate a shape to pass jit xyz_scatter = torch.zeros( @@ -811,8 +822,8 @@ def forward( result = result.view(nf, nloc, self.filter_neuron[-1] * self.axis_neuron) rot_mat = rot_mat.view([nf, nloc] + list(rot_mat.shape[1:])) # noqa:RUF005 return ( - result.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), - rot_mat.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + result, + rot_mat, None, None, sw, diff --git a/deepmd/pt/model/descriptor/se_atten.py b/deepmd/pt/model/descriptor/se_atten.py index a4e3d44bf0..5aa78fc3f5 100644 --- a/deepmd/pt/model/descriptor/se_atten.py +++ b/deepmd/pt/model/descriptor/se_atten.py @@ -227,12 +227,8 @@ def __init__( ) wanted_shape = (self.ntypes, self.nnei, 4) - mean = torch.zeros( - wanted_shape, dtype=env.GLOBAL_PT_FLOAT_PRECISION, device=env.DEVICE - ) - stddev = torch.ones( - wanted_shape, dtype=env.GLOBAL_PT_FLOAT_PRECISION, device=env.DEVICE - ) + mean = torch.zeros(wanted_shape, dtype=self.prec, device=env.DEVICE) + stddev = torch.ones(wanted_shape, dtype=self.prec, device=env.DEVICE) self.register_buffer("mean", mean) self.register_buffer("stddev", stddev) self.tebd_dim_input = self.tebd_dim if self.type_one_side else self.tebd_dim * 2 @@ -568,8 +564,6 @@ def forward( # nfnl x nnei x ng # gg = gg_s * gg_t + gg_s gg_t = gg_t.reshape(-1, gg_t.size(-1)) - # Convert all tensors to the required precision at once - ss, rr, gg_t = (t.to(self.prec) for t in (ss, rr, gg_t)) xyz_scatter = torch.ops.deepmd.tabulate_fusion_se_atten( self.compress_data[0].contiguous(), self.compress_info[0].cpu().contiguous(), diff --git a/deepmd/pt/model/descriptor/se_r.py b/deepmd/pt/model/descriptor/se_r.py index beb8acd5d5..3beb21b047 100644 --- a/deepmd/pt/model/descriptor/se_r.py +++ b/deepmd/pt/model/descriptor/se_r.py @@ -456,6 +456,8 @@ def forward( The smooth switch function. """ + # cast the input to internal precsion + coord_ext = coord_ext.to(dtype=self.prec) del mapping, comm_dict nf = nlist.shape[0] nloc = nlist.shape[1] @@ -474,7 +476,6 @@ def forward( assert self.filter_layers is not None dmatrix = dmatrix.view(-1, self.nnei, 1) - dmatrix = dmatrix.to(dtype=self.prec) nfnl = dmatrix.shape[0] # pre-allocate a shape to pass jit xyz_scatter = torch.zeros( @@ -519,7 +520,7 @@ def forward( None, None, None, - sw, + sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), ) def set_stat_mean_and_stddev( diff --git a/deepmd/pt/model/descriptor/se_t.py b/deepmd/pt/model/descriptor/se_t.py index ae9b3a9c1a..8f2d2b807d 100644 --- a/deepmd/pt/model/descriptor/se_t.py +++ b/deepmd/pt/model/descriptor/se_t.py @@ -154,6 +154,7 @@ def __init__( super().__init__() self.type_map = type_map self.compress = False + self.prec = PRECISION_DICT[precision] self.seat = DescrptBlockSeT( rcut, rcut_smth, @@ -373,7 +374,18 @@ def forward( The smooth switch function. """ - return self.seat.forward(nlist, coord_ext, atype_ext, None, mapping) + # cast the input to internal precsion + coord_ext = coord_ext.to(dtype=self.prec) + g1, rot_mat, g2, h2, sw = self.seat.forward( + nlist, coord_ext, atype_ext, None, mapping + ) + return ( + g1.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + None, + None, + None, + sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + ) def set_stat_mean_and_stddev( self, @@ -801,7 +813,6 @@ def forward( protection=self.env_protection, ) dmatrix = dmatrix.view(-1, self.nnei, 4) - dmatrix = dmatrix.to(dtype=self.prec) nfnl = dmatrix.shape[0] # pre-allocate a shape to pass jit result = torch.zeros( @@ -832,8 +843,6 @@ def forward( env_ij = torch.einsum("ijm,ikm->ijk", rr_i, rr_j) if self.compress: ebd_env_ij = env_ij.view(-1, 1) - ebd_env_ij = ebd_env_ij.to(dtype=self.prec) - env_ij = env_ij.to(dtype=self.prec) res_ij = torch.ops.deepmd.tabulate_fusion_se_t( compress_data_ii.contiguous(), compress_info_ii.cpu().contiguous(), @@ -853,7 +862,7 @@ def forward( # xyz_scatter /= (self.nnei * self.nnei) result = result.view(nf, nloc, self.filter_neuron[-1]) return ( - result.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + result, None, None, None, diff --git a/deepmd/pt/model/descriptor/se_t_tebd.py b/deepmd/pt/model/descriptor/se_t_tebd.py index 82ccb06f32..e7b4827724 100644 --- a/deepmd/pt/model/descriptor/se_t_tebd.py +++ b/deepmd/pt/model/descriptor/se_t_tebd.py @@ -161,6 +161,7 @@ def __init__( smooth=smooth, seed=child_seed(seed, 1), ) + self.prec = PRECISION_DICT[precision] self.use_econf_tebd = use_econf_tebd self.type_map = type_map self.smooth = smooth @@ -441,12 +442,14 @@ def forward( The smooth switch function. shape: nf x nloc x nnei """ + # cast the input to internal precsion + extended_coord = extended_coord.to(dtype=self.prec) del mapping nframes, nloc, nnei = nlist.shape nall = extended_coord.view(nframes, -1).shape[1] // 3 g1_ext = self.type_embedding(extended_atype) g1_inp = g1_ext[:, :nloc, :] - g1, g2, h2, rot_mat, sw = self.se_ttebd( + g1, _, _, _, sw = self.se_ttebd( nlist, extended_coord, extended_atype, @@ -456,7 +459,13 @@ def forward( if self.concat_output_tebd: g1 = torch.cat([g1, g1_inp], dim=-1) - return g1, rot_mat, g2, h2, sw + return ( + g1.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + None, + None, + None, + sw.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + ) @classmethod def update_sel( @@ -540,12 +549,8 @@ def __init__( self.reinit_exclude(exclude_types) wanted_shape = (self.ntypes, self.nnei, 4) - mean = torch.zeros( - wanted_shape, dtype=env.GLOBAL_PT_FLOAT_PRECISION, device=env.DEVICE - ) - stddev = torch.ones( - wanted_shape, dtype=env.GLOBAL_PT_FLOAT_PRECISION, device=env.DEVICE - ) + mean = torch.zeros(wanted_shape, dtype=self.prec, device=env.DEVICE) + stddev = torch.ones(wanted_shape, dtype=self.prec, device=env.DEVICE) self.register_buffer("mean", mean) self.register_buffer("stddev", stddev) self.tebd_dim_input = self.tebd_dim * 2 @@ -849,7 +854,7 @@ def forward( # nf x nl x ng result = res_ij.view(nframes, nloc, self.filter_neuron[-1]) return ( - result.to(dtype=env.GLOBAL_PT_FLOAT_PRECISION), + result, None, None, None, diff --git a/deepmd/pt/model/network/mlp.py b/deepmd/pt/model/network/mlp.py index f2137bd004..a5ac086770 100644 --- a/deepmd/pt/model/network/mlp.py +++ b/deepmd/pt/model/network/mlp.py @@ -200,7 +200,8 @@ def forward( The output. """ ori_prec = xx.dtype - xx = xx.to(self.prec) + if not env.DP_DTYPE_PROMOTION_STRICT: + xx = xx.to(self.prec) yy = ( torch.matmul(xx, self.matrix) + self.bias if self.bias is not None @@ -215,7 +216,8 @@ def forward( yy += torch.concat([xx, xx], dim=-1) else: yy = yy - yy = yy.to(ori_prec) + if not env.DP_DTYPE_PROMOTION_STRICT: + yy = yy.to(ori_prec) return yy def serialize(self) -> dict: diff --git a/deepmd/pt/model/task/dipole.py b/deepmd/pt/model/task/dipole.py index bc09fa4d0f..af81e54d13 100644 --- a/deepmd/pt/model/task/dipole.py +++ b/deepmd/pt/model/task/dipole.py @@ -180,6 +180,8 @@ def forward( ): nframes, nloc, _ = descriptor.shape assert gr is not None, "Must provide the rotation matrix for dipole fitting." + # cast the input to internal precsion + gr = gr.to(self.prec) # (nframes, nloc, m1) out = self._forward_common(descriptor, atype, gr, g2, h2, fparam, aparam)[ self.var_name diff --git a/deepmd/pt/model/task/fitting.py b/deepmd/pt/model/task/fitting.py index 470b420c89..798e271c8f 100644 --- a/deepmd/pt/model/task/fitting.py +++ b/deepmd/pt/model/task/fitting.py @@ -403,7 +403,11 @@ def _forward_common( fparam: Optional[torch.Tensor] = None, aparam: Optional[torch.Tensor] = None, ): - xx = descriptor + # cast the input to internal precsion + xx = descriptor.to(self.prec) + fparam = fparam.to(self.prec) if fparam is not None else None + aparam = aparam.to(self.prec) if aparam is not None else None + if self.remove_vaccum_contribution is not None: # TODO: compute the input for vaccm when remove_vaccum_contribution is set # Ideally, the input for vacuum should be computed; @@ -473,14 +477,16 @@ def _forward_common( outs = torch.zeros( (nf, nloc, net_dim_out), - dtype=env.GLOBAL_PT_FLOAT_PRECISION, + dtype=self.prec, device=descriptor.device, ) # jit assertion if self.mixed_types: - atom_property = self.filter_layers.networks[0](xx) + self.bias_atom_e[atype] + atom_property = self.filter_layers.networks[0](xx) if xx_zeros is not None: atom_property -= self.filter_layers.networks[0](xx_zeros) - outs = outs + atom_property # Shape is [nframes, natoms[0], net_dim_out] + outs = ( + outs + atom_property + self.bias_atom_e[atype].to(self.prec) + ) # Shape is [nframes, natoms[0], net_dim_out] else: for type_i, ll in enumerate(self.filter_layers.networks): mask = (atype == type_i).unsqueeze(-1) @@ -494,13 +500,13 @@ def _forward_common( and not self.remove_vaccum_contribution[type_i] ): atom_property -= ll(xx_zeros) - atom_property = atom_property + self.bias_atom_e[type_i] - atom_property = atom_property * mask + atom_property = atom_property + self.bias_atom_e[type_i].to(self.prec) + atom_property = torch.where(mask, atom_property, 0.0) outs = ( outs + atom_property ) # Shape is [nframes, natoms[0], net_dim_out] # nf x nloc - mask = self.emask(atype) + mask = self.emask(atype).to(torch.bool) # nf x nloc x nod - outs = outs * mask[:, :, None] - return {self.var_name: outs.to(env.GLOBAL_PT_FLOAT_PRECISION)} + outs = torch.where(mask[:, :, None], outs, 0.0) + return {self.var_name: outs} diff --git a/deepmd/pt/model/task/invar_fitting.py b/deepmd/pt/model/task/invar_fitting.py index acdd5b0fda..c339f4690d 100644 --- a/deepmd/pt/model/task/invar_fitting.py +++ b/deepmd/pt/model/task/invar_fitting.py @@ -177,7 +177,10 @@ def forward( ------- - `torch.Tensor`: Total energy with shape [nframes, natoms[0]]. """ - return self._forward_common(descriptor, atype, gr, g2, h2, fparam, aparam) + out = self._forward_common(descriptor, atype, gr, g2, h2, fparam, aparam)[ + self.var_name + ] + return {self.var_name: out.to(env.GLOBAL_PT_FLOAT_PRECISION)} # make jit happy with torch 2.0.0 exclude_types: list[int] diff --git a/deepmd/pt/model/task/polarizability.py b/deepmd/pt/model/task/polarizability.py index 7b7f92c3af..40a569fa80 100644 --- a/deepmd/pt/model/task/polarizability.py +++ b/deepmd/pt/model/task/polarizability.py @@ -233,11 +233,14 @@ def forward( assert ( gr is not None ), "Must provide the rotation matrix for polarizability fitting." + # cast the input to internal precsion + gr = gr.to(self.prec) # (nframes, nloc, _net_out_dim) out = self._forward_common(descriptor, atype, gr, g2, h2, fparam, aparam)[ self.var_name ] - out = out * (self.scale.to(atype.device))[atype] + out = out * (self.scale.to(atype.device).to(self.prec))[atype] + gr = gr.view(nframes * nloc, self.embedding_width, 3) # (nframes * nloc, m1, 3) if self.fit_diag: diff --git a/deepmd/pt/utils/env.py b/deepmd/pt/utils/env.py index 3ee0b7b54d..81dce669ff 100644 --- a/deepmd/pt/utils/env.py +++ b/deepmd/pt/utils/env.py @@ -15,6 +15,7 @@ ) SAMPLER_RECORD = os.environ.get("SAMPLER_RECORD", False) +DP_DTYPE_PROMOTION_STRICT = os.environ.get("DP_DTYPE_PROMOTION_STRICT", "0") == "1" try: # only linux ncpus = len(os.sched_getaffinity(0)) diff --git a/source/tests/pt/model/test_compressed_descriptor_dpa2.py b/source/tests/pt/model/test_compressed_descriptor_dpa2.py index 05b1143eb1..c7b3deba7e 100644 --- a/source/tests/pt/model/test_compressed_descriptor_dpa2.py +++ b/source/tests/pt/model/test_compressed_descriptor_dpa2.py @@ -53,11 +53,6 @@ def eval_pt_descriptor( class TestDescriptorDPA2(unittest.TestCase): def setUp(self): (self.dtype, self.type_one_side) = self.param - if self.dtype == "float32": - self.skipTest("FP32 has bugs:") - # ../../../../deepmd/pt/model/descriptor/repformer_layer.py:521: in forward - # torch.matmul(attnw.unsqueeze(-2), gg1v).squeeze(-2).view(nb, nloc, nh * ni) - # E RuntimeError: expected scalar type Float but found Double if self.dtype == "float32": self.atol = 1e-5 elif self.dtype == "float64": diff --git a/source/tests/pt/model/test_compressed_descriptor_se_atten.py b/source/tests/pt/model/test_compressed_descriptor_se_atten.py index a439255396..edb682b27b 100644 --- a/source/tests/pt/model/test_compressed_descriptor_se_atten.py +++ b/source/tests/pt/model/test_compressed_descriptor_se_atten.py @@ -115,11 +115,6 @@ def test_compressed_forward(self): self.box, ) - if self.dtype == "float32": - result_pt = result_pt.to(torch.float32) - elif self.dtype == "float64": - result_pt = result_pt.to(torch.float64) - self.se_atten.enable_compression(0.5) result_pt_compressed = eval_pt_descriptor( self.se_atten, diff --git a/source/tests/pt/model/test_dipole_fitting.py b/source/tests/pt/model/test_dipole_fitting.py index 71da2781ac..0c4121f457 100644 --- a/source/tests/pt/model/test_dipole_fitting.py +++ b/source/tests/pt/model/test_dipole_fitting.py @@ -262,7 +262,7 @@ def test_permu(self): nlist, ) - ret0 = ft0(rd0, atype, gr0, fparam=0, aparam=0) + ret0 = ft0(rd0, atype, gr0, fparam=None, aparam=None) res.append(ret0["dipole"]) np.testing.assert_allclose( @@ -303,7 +303,7 @@ def test_trans(self): nlist, ) - ret0 = ft0(rd0, atype, gr0, fparam=0, aparam=0) + ret0 = ft0(rd0, atype, gr0, fparam=None, aparam=None) res.append(ret0["dipole"]) np.testing.assert_allclose(to_numpy_array(res[0]), to_numpy_array(res[1])) diff --git a/source/tests/pt/model/test_polarizability_fitting.py b/source/tests/pt/model/test_polarizability_fitting.py index 1ca563a8c2..4e63145741 100644 --- a/source/tests/pt/model/test_polarizability_fitting.py +++ b/source/tests/pt/model/test_polarizability_fitting.py @@ -326,7 +326,7 @@ def test_trans(self): nlist, ) - ret0 = ft0(rd0, atype, gr0, fparam=0, aparam=0) + ret0 = ft0(rd0, atype, gr0, fparam=None, aparam=None) res.append(ret0["polarizability"]) np.testing.assert_allclose(to_numpy_array(res[0]), to_numpy_array(res[1])) diff --git a/source/tests/pt/model/test_property_fitting.py b/source/tests/pt/model/test_property_fitting.py index dfe2725f3b..ad5f3687e9 100644 --- a/source/tests/pt/model/test_property_fitting.py +++ b/source/tests/pt/model/test_property_fitting.py @@ -228,7 +228,7 @@ def test_trans(self): nlist, ) - ret0 = ft0(rd0, atype, gr0, fparam=0, aparam=0) + ret0 = ft0(rd0, atype, gr0, fparam=None, aparam=None) res.append(ret0["property"]) np.testing.assert_allclose(to_numpy_array(res[0]), to_numpy_array(res[1])) @@ -399,7 +399,7 @@ def test_trans(self): nlist, ) - ret0 = ft0(rd0, atype, gr0, fparam=0, aparam=0) + ret0 = ft0(rd0, atype, gr0, fparam=None, aparam=None) res.append(ret0["property"]) np.testing.assert_allclose(to_numpy_array(res[0]), to_numpy_array(res[1]))