From aab1931bf2c8741f4d3f26683fb82552a87ceb66 Mon Sep 17 00:00:00 2001 From: Duo Date: Fri, 4 Jun 2021 00:40:20 +0800 Subject: [PATCH 01/23] add gpu op unittest in source/tests --- source/tests/test_prod_env_mat.py | 4 +- source/tests/test_prod_force.py | 107 +++++++++++++++++++++++ source/tests/test_prod_force_grad.py | 109 ++++++++++++++++++++++++ source/tests/test_prod_virial.py | 112 ++++++++++++++++++++++++ source/tests/test_prod_virial_grad.py | 117 ++++++++++++++++++++++++++ 5 files changed, 447 insertions(+), 2 deletions(-) create mode 100644 source/tests/test_prod_force.py create mode 100644 source/tests/test_prod_force_grad.py create mode 100644 source/tests/test_prod_virial.py create mode 100644 source/tests/test_prod_virial_grad.py diff --git a/source/tests/test_prod_env_mat.py b/source/tests/test_prod_env_mat.py index 853d900109..2e8aa168f8 100644 --- a/source/tests/test_prod_env_mat.py +++ b/source/tests/test_prod_env_mat.py @@ -91,7 +91,7 @@ def test_pbc_self_built_nlist(self): self.assertEqual(drij.shape, (self.nframes, self.nloc*self.nnei*3)) self.assertEqual(dnlist.shape, (self.nframes, self.nloc*self.nnei)) for ff in range(self.nframes): - for ii in range(self.ndescrpt): + for ii in range(self.nloc*self.ndescrpt): self.assertAlmostEqual(dem[ff][ii], self.pbc_expected_output[ii], places=5) def test_pbc_self_built_nlist_deriv(self): @@ -142,7 +142,7 @@ def test_nopbc_self_built_nlist(self): self.assertEqual(drij.shape, (self.nframes, self.nloc*self.nnei*3)) self.assertEqual(dnlist.shape, (self.nframes, self.nloc*self.nnei)) for ff in range(self.nframes): - for ii in range(self.ndescrpt): + for ii in range(self.nloc*self.ndescrpt): self.assertAlmostEqual(dem[ff][ii], self.nopbc_expected_output[ii], places=5) diff --git a/source/tests/test_prod_force.py b/source/tests/test_prod_force.py new file mode 100644 index 0000000000..012fd7ee9b --- /dev/null +++ b/source/tests/test_prod_force.py @@ -0,0 +1,107 @@ +import os,sys +import numpy as np +import unittest + +import deepmd.op +from deepmd.env import tf +from deepmd.env import op_module +from deepmd.env import GLOBAL_TF_FLOAT_PRECISION +from deepmd.env import GLOBAL_NP_FLOAT_PRECISION +from deepmd.env import GLOBAL_ENER_FLOAT_PRECISION + +class TestProdForce(unittest.TestCase): + def setUp(self): + self.sess = tf.Session() + self.nframes = 2 + self.dcoord = [ + 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] + self.dtype = [0, 1, 1, 0, 1, 1] + self.dbox = [13., 0., 0., 0., 13., 0., 0., 0., 13.] + self.dnlist = [33, -1, -1, -1, -1, 1, 32, 34, 35, -1, + 0, 33, -1, -1, -1, 32, 34, 35, -1, -1, + 6, 3, -1, -1, -1, 7, 4, 5, -1, -1, + 6, -1, -1, -1, -1, 4, 5, 2, 7, -1, + 3, 6, -1, -1, -1, 5, 2, 7, -1, -1, + 3, 6, -1, -1, -1, 4, 2, 7, -1, -1] + self.dem_deriv = [0.13227682739491875, 0.01648776318803519, -0.013864709953575083, 0.12967498112414713, 0.0204174282700489, -0.017169201045268437, 0.0204174282700489, -0.031583528930688706, -0.0021400703852459233, -0.01716920104526844, -0.0021400703852459233, -0.03232887285478848, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7946522798827726, 0.33289487400494444, 0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.4206262499369199, 0.761133214171572, -0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, + -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.12240657396947655, -0.0016631327984983461, 0.013970315507385892, 0.12123416269111335, -0.0020346719145638054, 0.017091244082335703, -0.002034671914563806, -0.028490045221941415, -0.00023221799024912971, 0.017091244082335703, -0.00023221799024912971, -0.026567059102687942, 0.057945707686107975, 0.008613551142529565, -0.008091517739952026, 0.056503423854730866, 0.009417127630974357, -0.008846392623036528, 0.009417127630974357, -0.005448318729873151, -0.0013150043088297543, -0.008846392623036528, -0.0013150043088297541, -0.005612854948377751, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7946522798827726, -0.33289487400494444, -0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.06884320605436924, 0.002095928989945659, -0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3025931001933299, 0.11738525438534331, -0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.06555082496658332, -0.005338981218997747, -0.002076270474054677, 0.06523884623439505, -0.00599162877720186, -0.0023300778578007205, -0.00599162877720186, -0.007837034455273667, 0.00018978009701544363, -0.0023300778578007205, 0.00018978009701544363, -0.008251237047966105, 0.014091999096200191, 0.0009521621010946066, -0.00321014651226182, 0.013676554858123476, 0.0009667394698497006, -0.0032592930697789946, 0.0009667394698497006, -0.0005658690612028018, -0.00022022250471479668, -0.0032592930697789937, -0.00022022250471479666, 0.00011127514881492382, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.4206262499369199, -0.761133214171572, 0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.17265177804411166, -0.01776481317495682, 0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3025931001933299, -0.11738525438534331, 0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.13298898711407747, -0.03304327593938735, 0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, 0.09709214772325653, -0.00241522755530488, -0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1322768273949186, -0.016487763188035173, 0.013864709953575069, 0.12967498112414702, 0.020417428270048884, -0.017169201045268423, 0.02041742827004888, -0.03158352893068868, -0.002140070385245921, -0.017169201045268423, -0.002140070385245921, -0.03232887285478844, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1802999914938216, -0.5889799722131493, 0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, 1.0053013143052718, 0.24303987818369216, -0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.17265177804411166, 0.01776481317495682, -0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, -0.06884320605436924, -0.002095928989945659, 0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.1802999914938216, 0.5889799722131493, -0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, -0.12240657396947667, 0.0016631327984983487, -0.013970315507385913, 0.12123416269111348, -0.002034671914563809, 0.01709124408233573, -0.002034671914563809, -0.028490045221941467, -0.00023221799024913015, 0.01709124408233573, -0.00023221799024913015, -0.026567059102687987, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2602591506940697, 0.24313683814840728, -0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.13298898711407747, 0.03304327593938735, -0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, -0.0655508249665835, 0.005338981218997763, 0.002076270474054683, 0.0652388462343952, -0.005991628777201879, -0.0023300778578007283, -0.005991628777201879, -0.007837034455273709, 0.0001897800970154443, -0.002330077857800728, 0.0001897800970154443, -0.008251237047966148, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0053013143052718, -0.24303987818369216, 0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.057945707686107864, -0.008613551142529548, 0.00809151773995201, 0.05650342385473076, 0.009417127630974336, -0.00884639262303651, 0.009417127630974336, -0.005448318729873148, -0.0013150043088297515, -0.00884639262303651, -0.0013150043088297513, -0.005612854948377747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.2602591506940697, -0.24313683814840728, 0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.09709214772325653, 0.00241522755530488, 0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, -0.014091999096200191, -0.0009521621010946064, 0.0032101465122618194, 0.013676554858123474, 0.0009667394698497003, -0.0032592930697789933, 0.0009667394698497003, -0.0005658690612028016, -0.0002202225047147966, -0.0032592930697789933, -0.0002202225047147966, 0.00011127514881492362, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + self.dcoord = np.reshape(self.dcoord, [1, -1]) + self.dtype = np.reshape(self.dtype, [1, -1]) + self.dbox = np.reshape(self.dbox, [1, -1]) + self.dnlist = np.reshape(self.dnlist, [1, -1]) + self.dem_deriv = np.reshape(self.dem_deriv, [1, -1]) + self.dcoord = np.tile(self.dcoord, [self.nframes, 1]) + self.dtype = np.tile(self.dtype, [self.nframes, 1]) + self.dbox = np.tile(self.dbox, [self.nframes, 1]) + self.dnlist = np.tile(self.dnlist, [self.nframes, 1]) + self.dem_deriv = np.tile(self.dem_deriv, [self.nframes, 1]) + self.expected_force = [9.44498, -13.86254, 10.52884, -19.42688, 8.09273, 19.64478, 4.81771, 11.39255, 12.38830, -16.65832, 6.65153, -10.15585, + 1.16660, -14.43259, 22.97076, 22.86479, 7.42726, -11.41943, -7.67893, -7.23287, -11.33442, -4.51184, -3.80588, -2.44935, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 1.16217, 6.16192, -28.79094, 3.81076, -0.01986, -1.01629, 3.65869, -0.49195, -0.07437, 1.35028, 0.11969, -0.29201, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000] + + self.sel = [5, 5] + self.sec = np.array([0, 0, 0], dtype = int) + self.sec[1:3] = np.cumsum(self.sel) + self.rcut = 6. + self.rcut_smth = 0.8 + self.dnatoms = [6, 48, 2, 4] + + self.nloc = self.dnatoms[0] + self.nall = self.dnatoms[1] + self.nnei = self.sec[-1] + self.ndescrpt = 4 * self.nnei + self.ntypes = np.max(self.dtype) + 1 + self.dnet_deriv=[] + for ii in range(self.nloc * self.ndescrpt): + self.dnet_deriv.append(10-ii*0.01) + self.dnet_deriv = np.reshape(self.dnet_deriv, [1, -1]) + self.dnet_deriv = np.tile(self.dnet_deriv, [self.nframes, 1]) + + self.tnet_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt], name='t_net_deriv') + self.tem_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt * 3], name='t_em_deriv') + self.tnlist = tf.placeholder(tf.int32, [None, self.dnatoms[0] * self.nnei], name = "t_nlist") + self.tnatoms = tf.placeholder(tf.int32, [None], name = "t_natoms") + + def test_prod_force(self): + tforce \ + = op_module.prod_force_se_a( + self.tnet_deriv, + self.tem_deriv, + self.tnlist, + self.tnatoms, + n_a_sel=self.nnei, + n_r_sel=0) + self.sess.run (tf.global_variables_initializer()) + dforce = self.sess.run( + tforce, + feed_dict = { + self.tnet_deriv: self.dnet_deriv, + self.tem_deriv: self.dem_deriv, + self.tnlist: self.dnlist, + self.tnatoms: self.dnatoms} + ) + self.assertEqual(dforce.shape, (self.nframes, self.nall*3)) + for ff in range(self.nframes): + for ii in range(self.nall*3): + self.assertAlmostEqual(dforce[ff][ii], self.expected_force[ii], places=5) diff --git a/source/tests/test_prod_force_grad.py b/source/tests/test_prod_force_grad.py new file mode 100644 index 0000000000..da05406477 --- /dev/null +++ b/source/tests/test_prod_force_grad.py @@ -0,0 +1,109 @@ +import os,sys +import numpy as np +import unittest + +import deepmd.op +from deepmd.env import tf +from deepmd.env import op_grads_module +from deepmd.env import GLOBAL_TF_FLOAT_PRECISION +from deepmd.env import GLOBAL_NP_FLOAT_PRECISION +from deepmd.env import GLOBAL_ENER_FLOAT_PRECISION + +class TestProdForceGrad(unittest.TestCase): + def setUp(self): + self.sess = tf.Session() + self.nframes = 2 + self.dcoord = [ + 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] + self.dtype = [0, 1, 1, 0, 1, 1] + self.dbox = [13., 0., 0., 0., 13., 0., 0., 0., 13.] + self.dnlist = [33, -1, -1, -1, -1, 1, 32, 34, 35, -1, + 0, 33, -1, -1, -1, 32, 34, 35, -1, -1, + 6, 3, -1, -1, -1, 7, 4, 5, -1, -1, + 6, -1, -1, -1, -1, 4, 5, 2, 7, -1, + 3, 6, -1, -1, -1, 5, 2, 7, -1, -1, + 3, 6, -1, -1, -1, 4, 2, 7, -1, -1] + self.dem_deriv = [0.13227682739491875, 0.01648776318803519, -0.013864709953575083, 0.12967498112414713, 0.0204174282700489, -0.017169201045268437, 0.0204174282700489, -0.031583528930688706, -0.0021400703852459233, -0.01716920104526844, -0.0021400703852459233, -0.03232887285478848, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7946522798827726, 0.33289487400494444, 0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.4206262499369199, 0.761133214171572, -0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, + -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.12240657396947655, -0.0016631327984983461, 0.013970315507385892, 0.12123416269111335, -0.0020346719145638054, 0.017091244082335703, -0.002034671914563806, -0.028490045221941415, -0.00023221799024912971, 0.017091244082335703, -0.00023221799024912971, -0.026567059102687942, 0.057945707686107975, 0.008613551142529565, -0.008091517739952026, 0.056503423854730866, 0.009417127630974357, -0.008846392623036528, 0.009417127630974357, -0.005448318729873151, -0.0013150043088297543, -0.008846392623036528, -0.0013150043088297541, -0.005612854948377751, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7946522798827726, -0.33289487400494444, -0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.06884320605436924, 0.002095928989945659, -0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3025931001933299, 0.11738525438534331, -0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.06555082496658332, -0.005338981218997747, -0.002076270474054677, 0.06523884623439505, -0.00599162877720186, -0.0023300778578007205, -0.00599162877720186, -0.007837034455273667, 0.00018978009701544363, -0.0023300778578007205, 0.00018978009701544363, -0.008251237047966105, 0.014091999096200191, 0.0009521621010946066, -0.00321014651226182, 0.013676554858123476, 0.0009667394698497006, -0.0032592930697789946, 0.0009667394698497006, -0.0005658690612028018, -0.00022022250471479668, -0.0032592930697789937, -0.00022022250471479666, 0.00011127514881492382, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.4206262499369199, -0.761133214171572, 0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.17265177804411166, -0.01776481317495682, 0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3025931001933299, -0.11738525438534331, 0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.13298898711407747, -0.03304327593938735, 0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, 0.09709214772325653, -0.00241522755530488, -0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1322768273949186, -0.016487763188035173, 0.013864709953575069, 0.12967498112414702, 0.020417428270048884, -0.017169201045268423, 0.02041742827004888, -0.03158352893068868, -0.002140070385245921, -0.017169201045268423, -0.002140070385245921, -0.03232887285478844, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1802999914938216, -0.5889799722131493, 0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, 1.0053013143052718, 0.24303987818369216, -0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.17265177804411166, 0.01776481317495682, -0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, -0.06884320605436924, -0.002095928989945659, 0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.1802999914938216, 0.5889799722131493, -0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, -0.12240657396947667, 0.0016631327984983487, -0.013970315507385913, 0.12123416269111348, -0.002034671914563809, 0.01709124408233573, -0.002034671914563809, -0.028490045221941467, -0.00023221799024913015, 0.01709124408233573, -0.00023221799024913015, -0.026567059102687987, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2602591506940697, 0.24313683814840728, -0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.13298898711407747, 0.03304327593938735, -0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, -0.0655508249665835, 0.005338981218997763, 0.002076270474054683, 0.0652388462343952, -0.005991628777201879, -0.0023300778578007283, -0.005991628777201879, -0.007837034455273709, 0.0001897800970154443, -0.002330077857800728, 0.0001897800970154443, -0.008251237047966148, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0053013143052718, -0.24303987818369216, 0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.057945707686107864, -0.008613551142529548, 0.00809151773995201, 0.05650342385473076, 0.009417127630974336, -0.00884639262303651, 0.009417127630974336, -0.005448318729873148, -0.0013150043088297515, -0.00884639262303651, -0.0013150043088297513, -0.005612854948377747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.2602591506940697, -0.24313683814840728, 0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.09709214772325653, 0.00241522755530488, 0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, -0.014091999096200191, -0.0009521621010946064, 0.0032101465122618194, 0.013676554858123474, 0.0009667394698497003, -0.0032592930697789933, 0.0009667394698497003, -0.0005658690612028016, -0.0002202225047147966, -0.0032592930697789933, -0.0002202225047147966, 0.00011127514881492362, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + self.dcoord = np.reshape(self.dcoord, [1, -1]) + self.dtype = np.reshape(self.dtype, [1, -1]) + self.dbox = np.reshape(self.dbox, [1, -1]) + self.dnlist = np.reshape(self.dnlist, [1, -1]) + self.dem_deriv = np.reshape(self.dem_deriv, [1, -1]) + self.dcoord = np.tile(self.dcoord, [self.nframes, 1]) + self.dtype = np.tile(self.dtype, [self.nframes, 1]) + self.dbox = np.tile(self.dbox, [self.nframes, 1]) + self.dnlist = np.tile(self.dnlist, [self.nframes, 1]) + self.dem_deriv = np.tile(self.dem_deriv, [self.nframes, 1]) + self.expected_grad_net = [-0.12141, -0.11963, 0.01198, 0.04647, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, -0.04188, 0.37642, 0.28680, 0.26547, -0.40861, 0.25610, -0.02009, 1.00344, -0.16166, -0.16355, 0.03691, 0.01165, -0.08770, -0.08561, -0.00398, 0.02366, 0.00000, 0.00000, 0.00000, 0.00000, + -0.04188, -0.37642, -0.28680, -0.26547, -0.03357, -0.03151, 0.00454, 0.01377, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, -0.04304, 0.05219, 0.08677, 0.16032, -0.05232, -0.05123, 0.01227, 0.00935, -0.01420, -0.01366, -0.00022, 0.00404, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + -0.40861, -0.25610, 0.02009, -1.00344, -0.04863, -0.04701, 0.02501, 0.01556, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, -0.04304, -0.05219, -0.08677, -0.16032, -0.08249, -0.07502, 0.04767, -0.00448, -0.08260, -0.08165, 0.01821, 0.01869, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + -0.12141, 0.11963, -0.01198, -0.04647, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, -0.16227, 0.28667, 0.50683, 0.06651, -0.58330, -0.45376, 0.37464, 0.93891, -0.04863, 0.04701, -0.02501, -0.01556, -0.03357, 0.03151, -0.00454, -0.01377, 0.00000, 0.00000, 0.00000, 0.00000, + -0.16227, -0.28667, -0.50683, -0.06651, -0.16166, 0.16355, -0.03691, -0.01165, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, -0.04418, 0.09284, 0.09569, 0.19565, -0.08249, 0.07502, -0.04767, 0.00448, -0.05232, 0.05123, -0.01227, -0.00935, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + -0.58330, 0.45376, -0.37464, -0.93891, -0.08770, 0.08561, 0.00398, -0.02366, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, -0.04418, -0.09284, -0.09569, -0.19565, -0.08260, 0.08165, -0.01821, -0.01869, -0.01420, 0.01366, 0.00022, -0.00404, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000] + + self.sel = [5, 5] + self.sec = np.array([0, 0, 0], dtype = int) + self.sec[1:3] = np.cumsum(self.sel) + self.rcut = 6. + self.rcut_smth = 0.8 + self.dnatoms = [6, 6, 2, 4] + + self.nloc = self.dnatoms[0] + self.nall = self.dnatoms[1] + self.nnei = self.sec[-1] + self.ndescrpt = 4 * self.nnei + self.ntypes = np.max(self.dtype) + 1 + self.dnet_deriv=[] + for ii in range(self.nloc * self.ndescrpt): + self.dnet_deriv.append(10-ii*0.01) + self.dgrad=[] + for ii in range(self.nloc * 3): + self.dgrad.append(10-ii*0.1) + self.dnet_deriv = np.reshape(self.dnet_deriv, [1, -1]) + self.dgrad = np.reshape(self.dgrad, [1, -1]) + self.dnet_deriv = np.tile(self.dnet_deriv, [self.nframes, 1]) + self.dgrad = np.tile(self.dgrad, [self.nframes, 1]) + + self.tgrad = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * 3], name='t_grad') + self.tnet_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt], name='t_net_deriv') + self.tem_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt * 3], name='t_em_deriv') + self.tnlist = tf.placeholder(tf.int32, [None, self.dnatoms[0] * self.nnei], name = "t_nlist") + self.tnatoms = tf.placeholder(tf.int32, [None], name = "t_natoms") + + def test_prod_force_grad(self): + tgrad_net \ + = op_grads_module.prod_force_se_a_grad( + self.tgrad, + self.tnet_deriv, + self.tem_deriv, + self.tnlist, + self.tnatoms, + n_a_sel=self.nnei, + n_r_sel=0) + self.sess.run (tf.global_variables_initializer()) + dgrad_net = self.sess.run( + tgrad_net, + feed_dict = { + self.tgrad: self.dgrad, + self.tnet_deriv: self.dnet_deriv, + self.tem_deriv: self.dem_deriv, + self.tnlist: self.dnlist, + self.tnatoms: self.dnatoms} + ) + self.assertEqual(dgrad_net.shape, (self.nframes, self.nloc*self.ndescrpt)) + for ff in range(self.nframes): + for ii in range(self.nloc*self.ndescrpt): + self.assertAlmostEqual(dgrad_net[ff][ii], self.expected_grad_net[ii], places=5) diff --git a/source/tests/test_prod_virial.py b/source/tests/test_prod_virial.py new file mode 100644 index 0000000000..4a22e95839 --- /dev/null +++ b/source/tests/test_prod_virial.py @@ -0,0 +1,112 @@ +import os,sys +import numpy as np +import unittest + +import deepmd.op +from deepmd.env import tf +from deepmd.env import op_module +from deepmd.env import GLOBAL_TF_FLOAT_PRECISION +from deepmd.env import GLOBAL_NP_FLOAT_PRECISION +from deepmd.env import GLOBAL_ENER_FLOAT_PRECISION + +class TestProdVirial(unittest.TestCase): + def setUp(self): + self.sess = tf.Session() + self.nframes = 2 + self.dcoord = [ + 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] + self.dtype = [0, 1, 1, 0, 1, 1] + self.dbox = [13., 0., 0., 0., 13., 0., 0., 0., 13.] + self.dnlist = [33, -1, -1, -1, -1, 1, 32, 34, 35, -1, + 0, 33, -1, -1, -1, 32, 34, 35, -1, -1, + 6, 3, -1, -1, -1, 7, 4, 5, -1, -1, + 6, -1, -1, -1, -1, 4, 5, 2, 7, -1, + 3, 6, -1, -1, -1, 5, 2, 7, -1, -1, + 3, 6, -1, -1, -1, 4, 2, 7, -1, -1] + self.dem_deriv = [0.13227682739491875, 0.01648776318803519, -0.013864709953575083, 0.12967498112414713, 0.0204174282700489, -0.017169201045268437, 0.0204174282700489, -0.031583528930688706, -0.0021400703852459233, -0.01716920104526844, -0.0021400703852459233, -0.03232887285478848, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7946522798827726, 0.33289487400494444, 0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.4206262499369199, 0.761133214171572, -0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, + -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.12240657396947655, -0.0016631327984983461, 0.013970315507385892, 0.12123416269111335, -0.0020346719145638054, 0.017091244082335703, -0.002034671914563806, -0.028490045221941415, -0.00023221799024912971, 0.017091244082335703, -0.00023221799024912971, -0.026567059102687942, 0.057945707686107975, 0.008613551142529565, -0.008091517739952026, 0.056503423854730866, 0.009417127630974357, -0.008846392623036528, 0.009417127630974357, -0.005448318729873151, -0.0013150043088297543, -0.008846392623036528, -0.0013150043088297541, -0.005612854948377751, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7946522798827726, -0.33289487400494444, -0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.06884320605436924, 0.002095928989945659, -0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3025931001933299, 0.11738525438534331, -0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.06555082496658332, -0.005338981218997747, -0.002076270474054677, 0.06523884623439505, -0.00599162877720186, -0.0023300778578007205, -0.00599162877720186, -0.007837034455273667, 0.00018978009701544363, -0.0023300778578007205, 0.00018978009701544363, -0.008251237047966105, 0.014091999096200191, 0.0009521621010946066, -0.00321014651226182, 0.013676554858123476, 0.0009667394698497006, -0.0032592930697789946, 0.0009667394698497006, -0.0005658690612028018, -0.00022022250471479668, -0.0032592930697789937, -0.00022022250471479666, 0.00011127514881492382, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.4206262499369199, -0.761133214171572, 0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.17265177804411166, -0.01776481317495682, 0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3025931001933299, -0.11738525438534331, 0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.13298898711407747, -0.03304327593938735, 0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, 0.09709214772325653, -0.00241522755530488, -0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1322768273949186, -0.016487763188035173, 0.013864709953575069, 0.12967498112414702, 0.020417428270048884, -0.017169201045268423, 0.02041742827004888, -0.03158352893068868, -0.002140070385245921, -0.017169201045268423, -0.002140070385245921, -0.03232887285478844, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1802999914938216, -0.5889799722131493, 0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, 1.0053013143052718, 0.24303987818369216, -0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.17265177804411166, 0.01776481317495682, -0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, -0.06884320605436924, -0.002095928989945659, 0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.1802999914938216, 0.5889799722131493, -0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, -0.12240657396947667, 0.0016631327984983487, -0.013970315507385913, 0.12123416269111348, -0.002034671914563809, 0.01709124408233573, -0.002034671914563809, -0.028490045221941467, -0.00023221799024913015, 0.01709124408233573, -0.00023221799024913015, -0.026567059102687987, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2602591506940697, 0.24313683814840728, -0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.13298898711407747, 0.03304327593938735, -0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, -0.0655508249665835, 0.005338981218997763, 0.002076270474054683, 0.0652388462343952, -0.005991628777201879, -0.0023300778578007283, -0.005991628777201879, -0.007837034455273709, 0.0001897800970154443, -0.002330077857800728, 0.0001897800970154443, -0.008251237047966148, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0053013143052718, -0.24303987818369216, 0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.057945707686107864, -0.008613551142529548, 0.00809151773995201, 0.05650342385473076, 0.009417127630974336, -0.00884639262303651, 0.009417127630974336, -0.005448318729873148, -0.0013150043088297515, -0.00884639262303651, -0.0013150043088297513, -0.005612854948377747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.2602591506940697, -0.24313683814840728, 0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.09709214772325653, 0.00241522755530488, 0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, -0.014091999096200191, -0.0009521621010946064, 0.0032101465122618194, 0.013676554858123474, 0.0009667394698497003, -0.0032592930697789933, 0.0009667394698497003, -0.0005658690612028016, -0.0002202225047147966, -0.0032592930697789933, -0.0002202225047147966, 0.00011127514881492362, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + self.drij = [3.5299999999999976, 0.4399999999999995, -0.37000000000000055, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.06099789543e-313, 0.0, 0.0, -0.740000000000002, 0.31000000000000005, 0.5599999999999996, 0.41999999999999815, 0.7599999999999993, -0.5000000000000007, 3.6799999999999997, -0.05000000000000071, 0.4199999999999995, 4.439999999999998, 0.6599999999999997, -0.6200000000000006, 1.06099789543e-313, 3.11, -0.31999999999999984, 0.740000000000002, -0.31000000000000005, -0.5599999999999996, 4.27, 0.12999999999999945, -0.9300000000000002, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.06099789543e-313, 3.26, -0.81, 1.1600000000000001, 0.4499999999999993, -1.0600000000000003, 4.420000000000002, -0.36000000000000076, -0.14000000000000012, 5.18, 0.34999999999999964, -1.1800000000000002, 0.0, 0.0, 0.0, 1.06099789543e-313, 0.0, 0.0, + -0.41999999999999815, -0.7599999999999993, 0.5000000000000007, 3.11, -0.31999999999999984, 0.13000000000000012, 1.0609978957e-313, 2.1219957915e-314, 6.3659873744e-314, 6.3659873744e-314, 0.0, 0.0, 0.0, 0.1499999999999999, -0.4900000000000002, -1.1600000000000001, -0.4499999999999993, 1.0600000000000003, 3.2600000000000002, -0.81, 0.9200000000000002, 4.0200000000000005, -0.09999999999999964, -0.11999999999999988, 0.0, 0.0, 0.0, 0.0, -0.1499999999999999, 0.4900000000000002, -3.529999999999998, -0.4399999999999995, 0.37000000000000055, 0.0, 0.0, 0.0, 5e-324, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7599999999999998, 0.7100000000000004, 0.15000000000000036, -0.4900000000000002, 0.79, 0.9100000000000006, 0.2200000000000002, -0.25, -3.11, 0.31999999999999984, -0.13000000000000012, -4.27, -0.12999999999999945, 0.9300000000000002, 0.0, -0.9099999999999997, -0.2200000000000002, + -0.15000000000000036, 0.4900000000000002, -0.79, -3.6799999999999984, 0.05000000000000071, -0.4199999999999995, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7599999999999998, -0.7100000000000004, 0.7600000000000002, 0.7100000000000004, -1.04, -3.2600000000000002, 0.81, -0.9200000000000002, -4.42, 0.36000000000000076, 0.14000000000000012, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.9100000000000006, -0.2200000000000002, 0.25, -4.439999999999999, -0.6599999999999997, 0.6200000000000006, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7400000000000002, 0.31000000000000005, -0.7600000000000002, -0.7100000000000004, 1.04, -4.0200000000000005, 0.09999999999999964, 0.11999999999999988, -5.180000000000001, -0.34999999999999964, 1.1800000000000002, 0.0, 0.0, 0.0, 0.0, 0.7400000000000002, -0.31000000000000005] + self.dcoord = np.reshape(self.dcoord, [1, -1]) + self.dtype = np.reshape(self.dtype, [1, -1]) + self.dbox = np.reshape(self.dbox, [1, -1]) + self.dnlist = np.reshape(self.dnlist, [1, -1]) + self.dem_deriv = np.reshape(self.dem_deriv, [1, -1]) + self.drij = np.reshape(self.drij, [1, -1]) + self.dcoord = np.tile(self.dcoord, [self.nframes, 1]) + self.dtype = np.tile(self.dtype, [self.nframes, 1]) + self.dbox = np.tile(self.dbox, [self.nframes, 1]) + self.dnlist = np.tile(self.dnlist, [self.nframes, 1]) + self.dem_deriv = np.tile(self.dem_deriv, [self.nframes, 1]) + self.drij = np.tile(self.drij, [self.nframes, 1]) + self.expected_virial = [100.14628, 7.21146, -24.62874, 6.19651, 23.31547, -19.77773, -26.79150, -20.92554, 38.84203] + self.expected_atom_virial = [-3.24191, 1.35810, 2.45333, -9.14879, 3.83260, 6.92341, -10.54930, 4.41930, 7.98326, 14.83563, -6.21493, -11.22697, 4.51124, -1.88984, -3.41391, 2.04717, -0.85760, -1.54921, 0.84708, -0.10308, 0.07324, 3.51825, -0.49788, 0.40314, 2.91345, -0.37264, 0.27386, 12.62246, -5.19874, 7.42677, 4.80217, -2.69029, 5.41896, 9.55811, -2.42899, 5.14893, 9.90295, 4.54279, -7.75115, -2.89155, 13.50055, -20.91993, 4.00314, -1.76293, 2.92724, 20.15105, 2.86856, -3.55868, -4.22796, -1.12700, 1.46999, -21.43180, -9.30194, 12.54538, 2.86811, 5.92934, -3.94618, 4.83313, 5.21197, -3.36488, 6.67852, 8.34225, -5.44992, 5.97941, 1.92669, -4.70211, 4.91215, 1.63145, -3.96250, 3.27415, 1.02612, -2.52585, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 1.38833, 0.50613, -1.26233, 1.39901, 5.18116, -2.18118, -17.72748, -19.52039, 18.66001, 14.31034, 1.31715, -2.05955, -0.10872, 0.00743, 0.03656, -3.85572, -0.33481, 0.57900, 14.31190, -0.53814, 0.89498, -1.94166, 0.07960, -0.10726, -0.35985, 0.03981, 0.03397, 6.17091, 0.81760, -0.97011, 0.53923, 0.07572, -0.08012, -1.34189, -0.17373, 0.21536, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000] + self.sel = [5, 5] + self.sec = np.array([0, 0, 0], dtype = int) + self.sec[1:3] = np.cumsum(self.sel) + self.rcut = 6. + self.rcut_smth = 0.8 + self.dnatoms = [6, 48, 2, 4] + + self.nloc = self.dnatoms[0] + self.nall = self.dnatoms[1] + self.nnei = self.sec[-1] + self.ndescrpt = 4 * self.nnei + self.ntypes = np.max(self.dtype) + 1 + self.dnet_deriv=[] + for ii in range(self.nloc * self.ndescrpt): + self.dnet_deriv.append(10-ii*0.01) + self.dnet_deriv = np.reshape(self.dnet_deriv, [1, -1]) + self.dnet_deriv = np.tile(self.dnet_deriv, [self.nframes, 1]) + + self.tnet_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt], name='t_net_deriv') + self.tem_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt * 3], name='t_em_deriv') + self.trij = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.nnei * 3], name='t_rij') + self.tnlist = tf.placeholder(tf.int32, [None, self.dnatoms[0] * self.nnei], name = "t_nlist") + self.tnatoms = tf.placeholder(tf.int32, [None], name = "t_natoms") + + def test_prod_virial(self): + tvirial, tatom_virial \ + = op_module.prod_virial_se_a( + self.tnet_deriv, + self.tem_deriv, + self.trij, + self.tnlist, + self.tnatoms, + n_a_sel=self.nnei, + n_r_sel=0) + self.sess.run (tf.global_variables_initializer()) + dvirial, datom_virial = self.sess.run( + [tvirial, tatom_virial], + feed_dict = { + self.tnet_deriv: self.dnet_deriv, + self.tem_deriv: self.dem_deriv, + self.trij: self.drij, + self.tnlist: self.dnlist, + self.tnatoms: self.dnatoms} + ) + self.assertEqual(dvirial.shape, (self.nframes, 9)) + self.assertEqual(datom_virial.shape, (self.nframes, self.nall*9)) + for ff in range(self.nframes): + for ii in range(9): + self.assertAlmostEqual(dvirial[ff][ii], self.expected_virial[ii], places=5) + for ii in range(self.nall*9): + self.assertAlmostEqual(datom_virial[ff][ii], self.expected_atom_virial[ii], places=5) diff --git a/source/tests/test_prod_virial_grad.py b/source/tests/test_prod_virial_grad.py new file mode 100644 index 0000000000..60fdd7f66d --- /dev/null +++ b/source/tests/test_prod_virial_grad.py @@ -0,0 +1,117 @@ +import os,sys +import numpy as np +import unittest + +import deepmd.op +from deepmd.env import tf +from deepmd.env import op_grads_module +from deepmd.env import GLOBAL_TF_FLOAT_PRECISION +from deepmd.env import GLOBAL_NP_FLOAT_PRECISION +from deepmd.env import GLOBAL_ENER_FLOAT_PRECISION + +class TestProdVirialGrad(unittest.TestCase): + def setUp(self): + self.sess = tf.Session() + self.nframes = 2 + self.dcoord = [ + 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] + self.dtype = [0, 1, 1, 0, 1, 1] + self.dbox = [13., 0., 0., 0., 13., 0., 0., 0., 13.] + self.dnlist = [33, -1, -1, -1, -1, 1, 32, 34, 35, -1, + 0, 33, -1, -1, -1, 32, 34, 35, -1, -1, + 6, 3, -1, -1, -1, 7, 4, 5, -1, -1, + 6, -1, -1, -1, -1, 4, 5, 2, 7, -1, + 3, 6, -1, -1, -1, 5, 2, 7, -1, -1, + 3, 6, -1, -1, -1, 4, 2, 7, -1, -1] + self.dem_deriv = [0.13227682739491875, 0.01648776318803519, -0.013864709953575083, 0.12967498112414713, 0.0204174282700489, -0.017169201045268437, 0.0204174282700489, -0.031583528930688706, -0.0021400703852459233, -0.01716920104526844, -0.0021400703852459233, -0.03232887285478848, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7946522798827726, 0.33289487400494444, 0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.4206262499369199, 0.761133214171572, -0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, + -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.12240657396947655, -0.0016631327984983461, 0.013970315507385892, 0.12123416269111335, -0.0020346719145638054, 0.017091244082335703, -0.002034671914563806, -0.028490045221941415, -0.00023221799024912971, 0.017091244082335703, -0.00023221799024912971, -0.026567059102687942, 0.057945707686107975, 0.008613551142529565, -0.008091517739952026, 0.056503423854730866, 0.009417127630974357, -0.008846392623036528, 0.009417127630974357, -0.005448318729873151, -0.0013150043088297543, -0.008846392623036528, -0.0013150043088297541, -0.005612854948377751, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7946522798827726, -0.33289487400494444, -0.6013584820734476, 0.15412158847174678, -0.502001299580599, -0.9068410573068878, -0.502001299580599, -0.833906252681877, 0.3798928753582899, -0.9068410573068878, 0.3798928753582899, -0.3579459969766471, 0.06884320605436924, 0.002095928989945659, -0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3025931001933299, 0.11738525438534331, -0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.06555082496658332, -0.005338981218997747, -0.002076270474054677, 0.06523884623439505, -0.00599162877720186, -0.0023300778578007205, -0.00599162877720186, -0.007837034455273667, 0.00018978009701544363, -0.0023300778578007205, 0.00018978009701544363, -0.008251237047966105, 0.014091999096200191, 0.0009521621010946066, -0.00321014651226182, 0.013676554858123476, 0.0009667394698497006, -0.0032592930697789946, 0.0009667394698497006, -0.0005658690612028018, -0.00022022250471479668, -0.0032592930697789937, -0.00022022250471479666, 0.00011127514881492382, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.4206262499369199, -0.761133214171572, 0.5007455356391932, -0.6442543005863454, 0.635525177045359, -0.4181086691087898, 0.6355251770453592, 0.15453235677768898, -0.75657759172067, -0.4181086691087898, -0.75657759172067, -0.49771716703202185, 0.17265177804411166, -0.01776481317495682, 0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.3025931001933299, -0.11738525438534331, 0.2765074881076981, 0.034913562192579815, 0.15409432322878, -0.3629777391611269, 0.15409432322878003, -0.30252938969021487, -0.14081032984698866, -0.3629777391611269, -0.14081032984698866, -0.030620805157591004, 0.13298898711407747, -0.03304327593938735, 0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, 0.09709214772325653, -0.00241522755530488, -0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.1322768273949186, -0.016487763188035173, 0.013864709953575069, 0.12967498112414702, 0.020417428270048884, -0.017169201045268423, 0.02041742827004888, -0.03158352893068868, -0.002140070385245921, -0.017169201045268423, -0.002140070385245921, -0.03232887285478844, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1802999914938216, -0.5889799722131493, 0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, 1.0053013143052718, 0.24303987818369216, -0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.17265177804411166, 0.01776481317495682, -0.007216955352326217, 0.1708538944675734, -0.023853120077098278, 0.009690330031321191, -0.02385312007709828, -0.05851427595224925, -0.0009970757588497682, 0.00969033003132119, -0.0009970757588497682, -0.06056355425469288, -0.06884320605436924, -0.002095928989945659, 0.01499395354345747, 0.0668001797461137, 0.0023216922720068383, -0.016609029330510533, 0.0023216922720068383, -0.009387797963986713, -0.0005056613145120282, -0.016609029330510533, -0.0005056613145120282, -0.005841058553679004, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + -0.1802999914938216, 0.5889799722131493, -0.9495799552007915, -1.070225697321266, -0.18728687322613707, 0.30195230581356786, -0.18728687322613707, -0.5157546277429348, -0.9863775323243197, 0.30195230581356786, -0.9863775323243197, 0.4627237303364723, -0.12240657396947667, 0.0016631327984983487, -0.013970315507385913, 0.12123416269111348, -0.002034671914563809, 0.01709124408233573, -0.002034671914563809, -0.028490045221941467, -0.00023221799024913015, 0.01709124408233573, -0.00023221799024913015, -0.026567059102687987, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.2602591506940697, 0.24313683814840728, -0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.13298898711407747, 0.03304327593938735, -0.03753063440029181, 0.11967949867634801, -0.0393666881596552, 0.044712781613435545, -0.0393666881596552, -0.02897797727002851, + -0.01110961751744871, 0.044712781613435545, -0.011109617517448708, -0.026140939946396612, -0.0655508249665835, 0.005338981218997763, 0.002076270474054683, 0.0652388462343952, -0.005991628777201879, -0.0023300778578007283, -0.005991628777201879, -0.007837034455273709, 0.0001897800970154443, -0.002330077857800728, 0.0001897800970154443, -0.008251237047966148, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0053013143052718, -0.24303987818369216, 0.2761816797541954, 0.8183357773897718, 0.45521877564245394, -0.517294063230061, 0.45521877564245394, -0.9545617219529918, -0.1250601031984763, -0.517294063230061, -0.1250601031984763, -0.922500859133019, -0.057945707686107864, -0.008613551142529548, 0.00809151773995201, 0.05650342385473076, 0.009417127630974336, -0.00884639262303651, 0.009417127630974336, -0.005448318729873148, -0.0013150043088297515, -0.00884639262303651, -0.0013150043088297513, -0.005612854948377747, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.2602591506940697, -0.24313683814840728, 0.3561441009497795, -0.19841405298242495, 0.23891499072173572, -0.3499599864093028, 0.23891499072173572, -0.23095714382387694, -0.32693630309290145, -0.34995998640930287, -0.32693630309290145, 0.02473856993038946, -0.09709214772325653, 0.00241522755530488, 0.0028982730663658636, 0.09699249715361474, -0.0028489422636695603, -0.0034187307164034813, -0.00284894226366956, -0.017464112635362926, 8.504305264685245e-05, -0.003418730716403481, 8.504305264685245e-05, -0.017432930182725747, -0.014091999096200191, -0.0009521621010946064, 0.0032101465122618194, 0.013676554858123474, 0.0009667394698497003, -0.0032592930697789933, 0.0009667394698497003, -0.0005658690612028016, -0.0002202225047147966, -0.0032592930697789933, -0.0002202225047147966, 0.00011127514881492362, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] + self.drij = [3.5299999999999976, 0.4399999999999995, -0.37000000000000055, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.06099789543e-313, 0.0, 0.0, -0.740000000000002, 0.31000000000000005, 0.5599999999999996, 0.41999999999999815, 0.7599999999999993, -0.5000000000000007, 3.6799999999999997, -0.05000000000000071, 0.4199999999999995, 4.439999999999998, 0.6599999999999997, -0.6200000000000006, 1.06099789543e-313, 3.11, -0.31999999999999984, 0.740000000000002, -0.31000000000000005, -0.5599999999999996, 4.27, 0.12999999999999945, -0.9300000000000002, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.06099789543e-313, 3.26, -0.81, 1.1600000000000001, 0.4499999999999993, -1.0600000000000003, 4.420000000000002, -0.36000000000000076, -0.14000000000000012, 5.18, 0.34999999999999964, -1.1800000000000002, 0.0, 0.0, 0.0, 1.06099789543e-313, 0.0, 0.0, + -0.41999999999999815, -0.7599999999999993, 0.5000000000000007, 3.11, -0.31999999999999984, 0.13000000000000012, 1.0609978957e-313, 2.1219957915e-314, 6.3659873744e-314, 6.3659873744e-314, 0.0, 0.0, 0.0, 0.1499999999999999, -0.4900000000000002, -1.1600000000000001, -0.4499999999999993, 1.0600000000000003, 3.2600000000000002, -0.81, 0.9200000000000002, 4.0200000000000005, -0.09999999999999964, -0.11999999999999988, 0.0, 0.0, 0.0, 0.0, -0.1499999999999999, 0.4900000000000002, -3.529999999999998, -0.4399999999999995, 0.37000000000000055, 0.0, 0.0, 0.0, 5e-324, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.7599999999999998, 0.7100000000000004, 0.15000000000000036, -0.4900000000000002, 0.79, 0.9100000000000006, 0.2200000000000002, -0.25, -3.11, 0.31999999999999984, -0.13000000000000012, -4.27, -0.12999999999999945, 0.9300000000000002, 0.0, -0.9099999999999997, -0.2200000000000002, + -0.15000000000000036, 0.4900000000000002, -0.79, -3.6799999999999984, 0.05000000000000071, -0.4199999999999995, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7599999999999998, -0.7100000000000004, 0.7600000000000002, 0.7100000000000004, -1.04, -3.2600000000000002, 0.81, -0.9200000000000002, -4.42, 0.36000000000000076, 0.14000000000000012, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.9100000000000006, -0.2200000000000002, 0.25, -4.439999999999999, -0.6599999999999997, 0.6200000000000006, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.7400000000000002, 0.31000000000000005, -0.7600000000000002, -0.7100000000000004, 1.04, -4.0200000000000005, 0.09999999999999964, 0.11999999999999988, -5.180000000000001, -0.34999999999999964, 1.1800000000000002, 0.0, 0.0, 0.0, 0.0, 0.7400000000000002, -0.31000000000000005] + self.dcoord = np.reshape(self.dcoord, [1, -1]) + self.dtype = np.reshape(self.dtype, [1, -1]) + self.dbox = np.reshape(self.dbox, [1, -1]) + self.dnlist = np.reshape(self.dnlist, [1, -1]) + self.dem_deriv = np.reshape(self.dem_deriv, [1, -1]) + self.drij = np.reshape(self.drij, [1, -1]) + self.dcoord = np.tile(self.dcoord, [self.nframes, 1]) + self.dtype = np.tile(self.dtype, [self.nframes, 1]) + self.dbox = np.tile(self.dbox, [self.nframes, 1]) + self.dnlist = np.tile(self.dnlist, [self.nframes, 1]) + self.dem_deriv = np.tile(self.dem_deriv, [self.nframes, 1]) + self.drij = np.tile(self.drij, [self.nframes, 1]) + self.expected_grad_net = [5.01828, 4.97546, -0.09569, -1.15305, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, -0.61704, 1.06623, 0.15319, 0.24608, 5.28467, -2.59553, 3.00729, -8.19962, 5.03021, 5.02151, -0.86956, 0.26289, 2.75500, 2.70125, 0.22900, -0.54729, 0.00000, 0.00000, 0.00000, 0.00000, + -0.61704, -1.06623, -0.15319, -0.24608, 2.32844, 2.23467, -0.16758, -0.70940, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.74748, -0.30379, -1.11004, -3.49833, 2.42774, 2.39284, -0.45567, -0.22216, 0.60993, 0.59054, 0.02135, -0.15332, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 5.28467, 2.59553, -3.00729, 8.19962, 4.77234, 4.62396, -1.90919, -0.44792, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.74748, 0.30379, 1.11004, 3.49833, 4.06655, 3.57849, -2.07817, 0.88468, 3.61241, 3.58881, -0.57839, -0.39969, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 5.01828, -4.97546, 0.09569, 1.15305, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.07573, -3.82089, -2.40143, -0.67375, 9.64382, 8.39638, -2.48922, -9.00792, 4.77234, -4.62396, 1.90919, 0.44792, 2.32844, -2.23467, 0.16758, 0.70940, 0.00000, 0.00000, 0.00000, 0.00000, + 0.07573, 3.82089, 2.40143, 0.67375, 5.03021, -5.02151, 0.86956, -0.26289, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.44012, -1.15994, -0.66718, -3.33981, 4.06655, -3.57849, 2.07817, -0.88468, 2.42774, -2.39284, 0.45567, 0.22216, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 9.64382, -8.39638, 2.48922, 9.00792, 2.75500, -2.70125, -0.22900, 0.54729, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.44012, 1.15994, 0.66718, 3.33981, 3.61241, -3.58881, 0.57839, 0.39969, 0.60993, -0.59054, -0.02135, 0.15332, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000] + + self.sel = [5, 5] + self.sec = np.array([0, 0, 0], dtype = int) + self.sec[1:3] = np.cumsum(self.sel) + self.rcut = 6. + self.rcut_smth = 0.8 + self.dnatoms = [6, 6, 2, 4] + + self.nloc = self.dnatoms[0] + self.nall = self.dnatoms[1] + self.nnei = self.sec[-1] + self.ndescrpt = 4 * self.nnei + self.ntypes = np.max(self.dtype) + 1 + self.dnet_deriv=[] + for ii in range(self.nloc * self.ndescrpt): + self.dnet_deriv.append(10-ii*0.01) + self.dgrad=[] + for ii in range(9): + self.dgrad.append(10-ii*1.) + self.dnet_deriv = np.reshape(self.dnet_deriv, [1, -1]) + self.dgrad = np.reshape(self.dgrad, [1, -1]) + self.dnet_deriv = np.tile(self.dnet_deriv, [self.nframes, 1]) + self.dgrad = np.tile(self.dgrad, [self.nframes, 1]) + + self.tgrad = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, 9], name='t_grad') + self.tnet_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt], name='t_net_deriv') + self.tem_deriv = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.ndescrpt * 3], name='t_em_deriv') + self.trij = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, self.dnatoms[0] * self.nnei * 3], name='t_rij') + self.tnlist = tf.placeholder(tf.int32, [None, self.dnatoms[0] * self.nnei], name = "t_nlist") + self.tnatoms = tf.placeholder(tf.int32, [None], name = "t_natoms") + + def test_prod_virial_grad(self): + tgrad_net \ + = op_grads_module.prod_virial_se_a_grad( + self.tgrad, + self.tnet_deriv, + self.tem_deriv, + self.trij, + self.tnlist, + self.tnatoms, + n_a_sel=self.nnei, + n_r_sel=0) + self.sess.run (tf.global_variables_initializer()) + dgrad_net = self.sess.run( + tgrad_net, + feed_dict = { + self.tgrad: self.dgrad, + self.tnet_deriv: self.dnet_deriv, + self.tem_deriv: self.dem_deriv, + self.trij: self.drij, + self.tnlist: self.dnlist, + self.tnatoms: self.dnatoms} + ) + self.assertEqual(dgrad_net.shape, (self.nframes, self.nloc*self.ndescrpt)) + for ff in range(self.nframes): + for ii in range(self.nloc*self.ndescrpt): + self.assertAlmostEqual(dgrad_net[ff][ii], self.expected_grad_net[ii], places=5) From d5dca99c20a186b7798c8f213f77eb22af31380f Mon Sep 17 00:00:00 2001 From: Duo Date: Mon, 14 Jun 2021 17:31:32 +0800 Subject: [PATCH 02/23] fix bug in #713 --- source/lib/src/coord.cc | 4 ++-- source/lib/src/cuda/coord.cu | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/lib/src/coord.cc b/source/lib/src/coord.cc index b88800f7f7..ecaec9b34c 100644 --- a/source/lib/src/coord.cc +++ b/source/lib/src/coord.cc @@ -18,8 +18,8 @@ normalize_coord_cpu( FPTYPE ri[3]; convert_to_inter_cpu(ri, region, coord+3*ii); for(int dd = 0; dd < 3; ++dd){ - while(ri[dd] >= 1.) ri[dd] -= 1.; - while(ri[dd] < 0.) ri[dd] += 1.; + ri[dd] = fmod(ri[dd], 1.); + if (ri[dd] < 0.) ri[dd] += 1.; } convert_to_phys_cpu(coord+3*ii, region, ri); } diff --git a/source/lib/src/cuda/coord.cu b/source/lib/src/cuda/coord.cu index 317a8d42c9..c11609c57f 100644 --- a/source/lib/src/cuda/coord.cu +++ b/source/lib/src/cuda/coord.cu @@ -65,8 +65,8 @@ __global__ void normalize_one( FPTYPE inter[3]; phys2Inter(inter,out_c+idy*3,rec_boxt); for (int dd = 0; dd < 3; ++dd) { - while(inter[dd] >= 1.) inter[dd] -= 1.; - while(inter[dd] < 0.) inter[dd] += 1.; + inter[dd]=(FPTYPE)fmod((double)inter[dd], 1.); + if (inter[dd] < 0.) inter[dd] += 1.; } inter2Phys(out_c+idy*3,inter,boxt); } From 9f9fdae82952fb1b2efef14c61b83e45e033509b Mon Sep 17 00:00:00 2001 From: Duo Date: Sun, 27 Jun 2021 01:42:17 +0800 Subject: [PATCH 03/23] Fix bug of empty input in gelu.cu --- source/lib/src/cuda/gelu.cu | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/lib/src/cuda/gelu.cu b/source/lib/src/cuda/gelu.cu index 2b5b3074bb..ba9cdad4b7 100644 --- a/source/lib/src/cuda/gelu.cu +++ b/source/lib/src/cuda/gelu.cu @@ -55,6 +55,9 @@ void gelu_gpu_cuda( const FPTYPE * xx, const int size) { + if(size <= 0){ + return; + } const int THREAD_ITEMS = 1024; const int BLOCK_NUMS = (size + THREAD_ITEMS - 1) / THREAD_ITEMS; @@ -68,6 +71,9 @@ void gelu_grad_gpu_cuda( const FPTYPE * dy, const int size) { + if(size <= 0){ + return; + } const int THREAD_ITEMS = 1024; const int BLOCK_NUMS = (size + THREAD_ITEMS - 1) / THREAD_ITEMS; @@ -82,6 +88,9 @@ void gelu_grad_grad_gpu_cuda( const FPTYPE * dy_2, const int size) { + if(size <= 0){ + return; + } const int THREAD_ITEMS = 1024; const int BLOCK_NUMS = (size + THREAD_ITEMS - 1) / THREAD_ITEMS; From cb035d4ee83329c965fa79c6dbd0a44080ad07ab Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 00:36:31 +0800 Subject: [PATCH 04/23] Upload attention based model --- deepmd/descriptor/__init__.py | 1 + deepmd/descriptor/se_atten.py | 766 +++++++++++++ deepmd/entrypoints/train.py | 5 +- deepmd/fit/ener.py | 50 +- deepmd/model/ener.py | 41 +- deepmd/train/trainer.py | 26 +- deepmd/utils/argcheck.py | 44 + deepmd/utils/data.py | 22 +- deepmd/utils/data_system.py | 1 + deepmd/utils/type_embed.py | 41 +- examples/water/se_atten/input.json | 70 ++ source/lib/include/neighbor_list.h | 36 + source/lib/include/prod_env_mat.h | 61 + source/lib/src/cuda/neighbor_list.cu | 83 ++ source/lib/src/cuda/prod_env_mat.cu | 42 + source/lib/src/neighbor_list.cc | 78 ++ source/lib/src/prod_env_mat.cc | 147 +++ source/lib/src/rocm/neighbor_list.hip.cu | 83 ++ source/lib/src/rocm/prod_env_mat.hip.cu | 42 + source/lib/tests/test_env_mat_a_mix.cc | 1048 ++++++++++++++++++ source/op/prod_env_mat_multi_device.cc | 424 ++++++- source/tests/common.py | 54 +- source/tests/test_data_large_batch.py | 173 +++ source/tests/test_descrpt_se_atten.py | 248 +++++ source/tests/test_model_se_atten.py | 134 +++ source/tests/water_se_atten.json | 66 ++ source/tests/water_se_atten_large_batch.json | 66 ++ 27 files changed, 3792 insertions(+), 60 deletions(-) create mode 100644 deepmd/descriptor/se_atten.py create mode 100644 examples/water/se_atten/input.json create mode 100644 source/lib/tests/test_env_mat_a_mix.cc create mode 100644 source/tests/test_data_large_batch.py create mode 100644 source/tests/test_descrpt_se_atten.py create mode 100644 source/tests/test_model_se_atten.py create mode 100644 source/tests/water_se_atten.json create mode 100644 source/tests/water_se_atten_large_batch.json diff --git a/deepmd/descriptor/__init__.py b/deepmd/descriptor/__init__.py index dd022a4e08..e4df063a81 100644 --- a/deepmd/descriptor/__init__.py +++ b/deepmd/descriptor/__init__.py @@ -7,3 +7,4 @@ from .se_a_ef import DescrptSeAEf from .se_a_ef import DescrptSeAEfLower from .loc_frame import DescrptLocFrame +from .se_atten import DescrptSeAtten diff --git a/deepmd/descriptor/se_atten.py b/deepmd/descriptor/se_atten.py new file mode 100644 index 0000000000..218635ce68 --- /dev/null +++ b/deepmd/descriptor/se_atten.py @@ -0,0 +1,766 @@ +import math +import numpy as np +from typing import Tuple, List, Dict, Any + +from deepmd.env import tf +from deepmd.common import get_activation_func, get_precision, cast_precision +from deepmd.env import GLOBAL_TF_FLOAT_PRECISION +from deepmd.env import GLOBAL_NP_FLOAT_PRECISION +from deepmd.env import op_module +from deepmd.env import default_tf_session_config +from deepmd.utils.network import one_layer, embedding_net, embedding_net_rand_seed_shift +from deepmd.utils.tabulate import DPTabulate +from deepmd.utils.type_embed import embed_atom_type +from deepmd.utils.sess import run_sess +from deepmd.utils.graph import load_graph_def, get_tensor_by_name_from_graph, get_tensor_by_name +from deepmd.utils.errors import GraphWithoutTensorError +from .descriptor import Descriptor +from .se_a import DescrptSeA + + +@Descriptor.register("se_atten") +class DescrptSeAtten(DescrptSeA): + """ + Parameters + ---------- + rcut + The cut-off radius :math:`r_c` + rcut_smth + From where the environment matrix should be smoothed :math:`r_s` + sel : list[str] + sel[i] specifies the maxmum number of type i atoms in the cut-off radius + neuron : list[int] + Number of neurons in each hidden layers of the embedding net :math:`\mathcal{N}` + axis_neuron + Number of the axis neuron :math:`M_2` (number of columns of the sub-matrix of the embedding matrix) + resnet_dt + Time-step `dt` in the resnet construction: + y = x + dt * \phi (Wx + b) + trainable + If the weights of embedding net are trainable. + seed + Random seed for initializing the network parameters. + type_one_side + Try to build N_types embedding nets. Otherwise, building N_types^2 embedding nets + exclude_types : List[List[int]] + The excluded pairs of types which have no interaction with each other. + For example, `[[0, 1]]` means no interaction between type 0 and type 1. + set_davg_zero + Set the shift of embedding net input to zero. + activation_function + The activation function in the embedding net. Supported options are |ACTIVATION_FN| + precision + The precision of the embedding net parameters. Supported options are |PRECISION| + uniform_seed + Only for the purpose of backward compatibility, retrieves the old behavior of using the random seed + """ + + def __init__(self, + rcut: float, + rcut_smth: float, + sel: int, + ntypes: int, + neuron: List[int] = [24, 48, 96], + axis_neuron: int = 8, + resnet_dt: bool = False, + trainable: bool = True, + seed: int = None, + type_one_side: bool = True, + exclude_types: List[List[int]] = [], + set_davg_zero: bool = False, + activation_function: str = 'tanh', + precision: str = 'default', + uniform_seed: bool = False, + attn: int = 128, + attn_layer: int = 2, + attn_dotr: bool = False, + attn_mask: bool = False + ) -> None: + DescrptSeA.__init__(self, + rcut, + rcut_smth, + [sel], + neuron=neuron, + axis_neuron=axis_neuron, + resnet_dt=resnet_dt, + trainable=trainable, + seed=seed, + type_one_side=type_one_side, + exclude_types=exclude_types, + set_davg_zero=set_davg_zero, + activation_function=activation_function, + precision=precision, + uniform_seed=uniform_seed + ) + """ + Constructor + """ + self.ntypes = ntypes + self.att_n = attn + self.attn_layer = attn_layer + self.attn_mask = attn_mask + self.attn_dotr = attn_dotr + + # descrpt config + self.sel_all_a = [sel] + self.sel_all_r = [0] + avg_zero = np.zeros([self.ntypes, self.ndescrpt]).astype(GLOBAL_NP_FLOAT_PRECISION) + std_ones = np.ones([self.ntypes, self.ndescrpt]).astype(GLOBAL_NP_FLOAT_PRECISION) + sub_graph = tf.Graph() + with sub_graph.as_default(): + name_pfx = 'd_sea_' + for ii in ['coord', 'box']: + self.place_holders[ii] = tf.placeholder(GLOBAL_NP_FLOAT_PRECISION, [None, None], + name=name_pfx + 't_' + ii) + self.place_holders['type'] = tf.placeholder(tf.int32, [None, None], name=name_pfx + 't_type') + self.place_holders['natoms_vec'] = tf.placeholder(tf.int32, [self.ntypes + 2], name=name_pfx + 't_natoms') + self.place_holders['default_mesh'] = tf.placeholder(tf.int32, [None], name=name_pfx + 't_mesh') + self.stat_descrpt, self.descrpt_deriv_t, self.rij_t, self.nlist_t, self.nei_type_vec_t, self.nmask_t \ + = op_module.prod_env_mat_a_mix(self.place_holders['coord'], + self.place_holders['type'], + self.place_holders['natoms_vec'], + self.place_holders['box'], + self.place_holders['default_mesh'], + tf.constant(avg_zero), + tf.constant(std_ones), + rcut_a=self.rcut_a, + rcut_r=self.rcut_r, + rcut_r_smth=self.rcut_r_smth, + sel_a=self.sel_all_a, + sel_r=self.sel_all_r) + self.sub_sess = tf.Session(graph=sub_graph, config=default_tf_session_config) + + def compute_input_stats(self, + data_coord: list, + data_box: list, + data_atype: list, + natoms_vec: list, + mesh: list, + input_dict: dict, + large_batch_mode: bool = False, + real_natoms_vec: list = None + ) -> None: + """ + Compute the statisitcs (avg and std) of the training data. The input will be normalized by the statistics. + + Parameters + ---------- + data_coord + The coordinates. Can be generated by deepmd.model.make_stat_input + data_box + The box. Can be generated by deepmd.model.make_stat_input + data_atype + The atom types. Can be generated by deepmd.model.make_stat_input + natoms_vec + The vector for the number of atoms of the system and different types of atoms. + If large_batch_mode is True, this para is blank. See real_natoms_vec. + mesh + The mesh for neighbor searching. Can be generated by deepmd.model.make_stat_input + input_dict + Dictionary for additional input + large_batch_mode + Perform the large batch mode or not. + If True, it means that a new system contains data from different systems originally with same nloc. + real_natoms_vec + If large_batch_mode is True, it takes in the real natoms_vec. + """ + all_davg = [] + all_dstd = [] + if True: + sumr = [] + suma = [] + sumn = [] + sumr2 = [] + suma2 = [] + if large_batch_mode: + sys_num = 0 + for cc, bb, tt, nn, mm, r_n in zip(data_coord, data_box, data_atype, natoms_vec, mesh, real_natoms_vec): + sysr, sysr2, sysa, sysa2, sysn \ + = self._compute_dstats_sys_smth(cc, bb, tt, nn, mm, large_batch_mode, r_n) + sys_num += 1 + sumr.append(sysr) + suma.append(sysa) + sumn.append(sysn) + sumr2.append(sysr2) + suma2.append(sysa2) + else: + for cc, bb, tt, nn, mm in zip(data_coord, data_box, data_atype, natoms_vec, mesh): + sysr, sysr2, sysa, sysa2, sysn \ + = self._compute_dstats_sys_smth(cc, bb, tt, nn, mm) + sumr.append(sysr) + suma.append(sysa) + sumn.append(sysn) + sumr2.append(sysr2) + suma2.append(sysa2) + sumr = np.sum(sumr, axis=0) + suma = np.sum(suma, axis=0) + sumn = np.sum(sumn, axis=0) + sumr2 = np.sum(sumr2, axis=0) + suma2 = np.sum(suma2, axis=0) + for type_i in range(self.ntypes): + davgunit = [sumr[type_i] / (sumn[type_i] + 1e-15), 0, 0, 0] + dstdunit = [self._compute_std(sumr2[type_i], sumr[type_i], sumn[type_i]), + self._compute_std(suma2[type_i], suma[type_i], sumn[type_i]), + self._compute_std(suma2[type_i], suma[type_i], sumn[type_i]), + self._compute_std(suma2[type_i], suma[type_i], sumn[type_i]) + ] + davg = np.tile(davgunit, self.ndescrpt // 4) + dstd = np.tile(dstdunit, self.ndescrpt // 4) + all_davg.append(davg) + all_dstd.append(dstd) + + if not self.set_davg_zero: + self.davg = np.array(all_davg) + self.dstd = np.array(all_dstd) + + def build(self, + coord_: tf.Tensor, + atype_: tf.Tensor, + natoms: tf.Tensor, + box_: tf.Tensor, + mesh: tf.Tensor, + input_dict: dict, + reuse: bool = None, + suffix: str = '' + ) -> tf.Tensor: + """ + Build the computational graph for the descriptor + + Parameters + ---------- + coord_ + The coordinate of atoms + atype_ + The type of atoms + natoms + The number of atoms. This tensor has the length of Ntypes + 2 + natoms[0]: number of local atoms + natoms[1]: total number of atoms held by this processor + natoms[i]: 2 <= i < Ntypes+2, number of type i atoms + mesh + For historical reasons, only the length of the Tensor matters. + if size of mesh == 6, pbc is assumed. + if size of mesh == 0, no-pbc is assumed. + input_dict + Dictionary for additional inputs + reuse + The weights in the networks should be reused when get the variable. + suffix + Name suffix to identify this descriptor + + Returns + ------- + descriptor + The output descriptor + """ + davg = self.davg + dstd = self.dstd + with tf.variable_scope('descrpt_attr' + suffix, reuse=reuse): + if davg is None: + davg = np.zeros([self.ntypes, self.ndescrpt]) + if dstd is None: + dstd = np.ones([self.ntypes, self.ndescrpt]) + t_rcut = tf.constant(np.max([self.rcut_r, self.rcut_a]), + name='rcut', + dtype=GLOBAL_TF_FLOAT_PRECISION) + t_ntypes = tf.constant(self.ntypes, + name='ntypes', + dtype=tf.int32) + t_ndescrpt = tf.constant(self.ndescrpt, + name='ndescrpt', + dtype=tf.int32) + t_sel = tf.constant(self.sel_a, + name='sel', + dtype=tf.int32) + t_original_sel = tf.constant(self.original_sel if self.original_sel is not None else self.sel_a, + name='original_sel', + dtype=tf.int32) + self.t_avg = tf.get_variable('t_avg', + davg.shape, + dtype=GLOBAL_TF_FLOAT_PRECISION, + trainable=False, + initializer=tf.constant_initializer(davg)) + self.t_std = tf.get_variable('t_std', + dstd.shape, + dtype=GLOBAL_TF_FLOAT_PRECISION, + trainable=False, + initializer=tf.constant_initializer(dstd)) + + with tf.control_dependencies([t_sel, t_original_sel]): + coord = tf.reshape(coord_, [-1, natoms[1] * 3]) + box = tf.reshape(box_, [-1, 9]) + atype = tf.reshape(atype_, [-1, natoms[1]]) + self.attn_weight = [None for i in range(self.attn_layer)] + self.angular_weight = [None for i in range(self.attn_layer)] + self.attn_weight_final = [None for i in range(self.attn_layer)] + self.G = None + self.qs = [None for i in range(self.attn_layer)] + self.ks = [None for i in range(self.attn_layer)] + self.vs = [None for i in range(self.attn_layer)] + + self.descrpt, self.descrpt_deriv, self.rij, self.nlist, self.nei_type_vec, self.nmask \ + = op_module.prod_env_mat_a_mix(coord, + atype, + natoms, + box, + mesh, + self.t_avg, + self.t_std, + rcut_a=self.rcut_a, + rcut_r=self.rcut_r, + rcut_r_smth=self.rcut_r_smth, + sel_a=self.sel_all_a, + sel_r=self.sel_all_r) + self.nei_type_vec = tf.reshape(self.nei_type_vec, [-1]) + self.nmask = tf.reshape(self.nmask, [-1, 1, self.sel_all_a[0]]) + self.negtive_mask = -(2 << 32) * (1.0 - self.nmask) + # only used when tensorboard was set as true + tf.summary.histogram('descrpt', self.descrpt) + tf.summary.histogram('rij', self.rij) + tf.summary.histogram('nlist', self.nlist) + + self.descrpt_reshape = tf.reshape(self.descrpt, [-1, self.ndescrpt]) + self.atype_nloc = tf.reshape(tf.slice(atype, [0, 0], [-1, natoms[0]]), + [-1]) ## lammps will have error without this + self._identity_tensors(suffix=suffix) + + self.dout, self.qmat = self._pass_filter(self.descrpt_reshape, + self.atype_nloc, + natoms, + input_dict, + suffix=suffix, + reuse=reuse, + trainable=self.trainable) + + # only used when tensorboard was set as true + tf.summary.histogram('embedding_net_output', self.dout) + return self.dout + + def _pass_filter(self, + inputs, + atype, + natoms, + input_dict, + reuse=None, + suffix='', + trainable=True): + assert (input_dict is not None and input_dict.get('type_embedding', None) is not None), \ + 'se_atten desctiptor must use type_embedding' + type_embedding = input_dict.get('type_embedding', None) + inputs = tf.reshape(inputs, [-1, natoms[0], self.ndescrpt]) + output = [] + output_qmat = [] + inputs_i = inputs + inputs_i = tf.reshape(inputs_i, [-1, self.ndescrpt]) + type_i = -1 + layer, qmat = self._filter(inputs_i, type_i, natoms, name='filter_type_all' + suffix, reuse=reuse, + trainable=trainable, activation_fn=self.filter_activation_fn, + type_embedding=type_embedding, atype=atype) + layer = tf.reshape(layer, [tf.shape(inputs)[0], natoms[0], self.get_dim_out()]) + qmat = tf.reshape(qmat, [tf.shape(inputs)[0], natoms[0], self.get_dim_rot_mat_1() * 3]) + output.append(layer) + output_qmat.append(qmat) + output = tf.concat(output, axis=1) + output_qmat = tf.concat(output_qmat, axis=1) + return output, output_qmat + + def _compute_dstats_sys_smth(self, + data_coord, + data_box, + data_atype, + natoms_vec, + mesh, + large_batch_mode=False, + real_natoms_vec=None): + dd_all, descrpt_deriv_t, rij_t, nlist_t, nei_type_vec_t, nmask_t \ + = run_sess(self.sub_sess, [self.stat_descrpt, self.descrpt_deriv_t, self.rij_t, self.nlist_t, self.nei_type_vec_t, self.nmask_t], + feed_dict={ + self.place_holders['coord']: data_coord, + self.place_holders['type']: data_atype, + self.place_holders['natoms_vec']: natoms_vec, + self.place_holders['box']: data_box, + self.place_holders['default_mesh']: mesh, + }) + if large_batch_mode: + nframes = dd_all.shape[0] + sysr = [0. for i in range(self.ntypes)] + sysa = [0. for i in range(self.ntypes)] + sysn = [0 for i in range(self.ntypes)] + sysr2 = [0. for i in range(self.ntypes)] + sysa2 = [0. for i in range(self.ntypes)] + for ff in range(nframes): + natoms = real_natoms_vec[ff] + dd_ff = np.reshape(dd_all[ff], [-1, self.ndescrpt * natoms[0]]) + start_index = 0 + for type_i in range(self.ntypes): + end_index = start_index + self.ndescrpt * natoms[2 + type_i] # center atom split + dd = dd_ff[:, start_index:end_index] + dd = np.reshape(dd, [-1, self.ndescrpt]) # nframes * typen_atoms , nnei * 4 + start_index = end_index + # compute + dd = np.reshape(dd, [-1, 4]) # nframes * typen_atoms * nnei, 4 + ddr = dd[:, :1] + dda = dd[:, 1:] + sumr = np.sum(ddr) + suma = np.sum(dda) / 3. + sumn = dd.shape[0] + sumr2 = np.sum(np.multiply(ddr, ddr)) + suma2 = np.sum(np.multiply(dda, dda)) / 3. + sysr[type_i] += sumr + sysa[type_i] += suma + sysn[type_i] += sumn + sysr2[type_i] += sumr2 + sysa2[type_i] += suma2 + else: + natoms = natoms_vec + dd_all = np.reshape(dd_all, [-1, self.ndescrpt * natoms[0]]) + start_index = 0 + sysr = [] + sysa = [] + sysn = [] + sysr2 = [] + sysa2 = [] + for type_i in range(self.ntypes): + end_index = start_index + self.ndescrpt * natoms[2 + type_i] # center atom split + dd = dd_all[:, start_index:end_index] + dd = np.reshape(dd, [-1, self.ndescrpt]) # nframes * typen_atoms , nnei * 4 + start_index = end_index + # compute + dd = np.reshape(dd, [-1, 4]) # nframes * typen_atoms * nnei, 4 + ddr = dd[:, :1] + dda = dd[:, 1:] + sumr = np.sum(ddr) + suma = np.sum(dda) / 3. + sumn = dd.shape[0] + sumr2 = np.sum(np.multiply(ddr, ddr)) + suma2 = np.sum(np.multiply(dda, dda)) / 3. + sysr.append(sumr) + sysa.append(suma) + sysn.append(sumn) + sysr2.append(sumr2) + sysa2.append(suma2) + return sysr, sysr2, sysa, sysa2, sysn + + def _lookup_type_embedding( + self, + xyz_scatter, + natype, + type_embedding, + ): + '''Concatenate `type_embedding` of neighbors and `xyz_scatter`. + If not self.type_one_side, concatenate `type_embedding` of center atoms as well. + + Parameters + ---------- + xyz_scatter: + shape is [nframes*natoms[0]*self.nnei, 1] + nframes: + shape is [] + natoms: + shape is [1+1+self.ntypes] + type_embedding: + shape is [self.ntypes, Y] where Y=jdata['type_embedding']['neuron'][-1] + + Returns + ------- + embedding: + environment of each atom represented by embedding. + ''' + te_out_dim = type_embedding.get_shape().as_list()[-1] + self.test_type_embedding = type_embedding + self.test_nei_embed = tf.nn.embedding_lookup(type_embedding, + self.nei_type_vec) # shape is [self.nnei, 1+te_out_dim] + # nei_embed = tf.tile(nei_embed, (nframes * natoms[0], 1)) # shape is [nframes*natoms[0]*self.nnei, te_out_dim] + nei_embed = tf.reshape(self.test_nei_embed, [-1, te_out_dim]) + self.embedding_input = tf.concat([xyz_scatter, nei_embed], + 1) # shape is [nframes*natoms[0]*self.nnei, 1+te_out_dim] + if not self.type_one_side: + self.atm_embed = tf.nn.embedding_lookup(type_embedding, natype) # shape is [nframes*natoms[0], te_out_dim] + self.atm_embed = tf.tile(self.atm_embed, + [1, self.nnei]) # shape is [nframes*natoms[0], self.nnei*te_out_dim] + self.atm_embed = tf.reshape(self.atm_embed, + [-1, te_out_dim]) # shape is [nframes*natoms[0]*self.nnei, te_out_dim] + self.embedding_input_2 = tf.concat([self.embedding_input, self.atm_embed], + 1) # shape is [nframes*natoms[0]*self.nnei, 1+te_out_dim+te_out_dim] + return self.embedding_input_2 + return self.embedding_input + + def _feedforward(self, input_xyz, d_in, d_mid): + residual = input_xyz + input_xyz = tf.nn.relu(one_layer( + input_xyz, + d_mid, + name='c_ffn1', + reuse=tf.AUTO_REUSE, + seed=self.seed, + activation_fn=None, + precision=self.filter_precision, + trainable=True, + uniform_seed=self.uniform_seed)) + input_xyz = one_layer( + input_xyz, + d_in, + name='c_ffn2', + reuse=tf.AUTO_REUSE, + seed=self.seed, + activation_fn=None, + precision=self.filter_precision, + trainable=True, + uniform_seed=self.uniform_seed) + input_xyz += residual + input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) + return input_xyz + + def _scaled_dot_attn(self, Q, K, V, temperature, input_r, dotr=False, do_mask=False, layer=0, save_weights=True): + attn = tf.matmul(Q / temperature, K, transpose_b=True) + attn *= self.nmask + attn += self.negtive_mask + attn = tf.nn.softmax(attn, axis=-1) + attn *= tf.reshape(self.nmask, [-1, attn.shape[-1], 1]) + if save_weights: + self.attn_weight[layer] = attn[0] # atom 0 + if dotr: + angular_weight = tf.matmul(input_r, input_r, transpose_b=True) # normalized + attn *= angular_weight + if save_weights: + self.angular_weight[layer] = angular_weight[0] # atom 0 + self.attn_weight_final[layer] = attn[0] # atom 0 + if do_mask: + nei = int(attn.shape[-1]) + mask = tf.cast(tf.ones((nei, nei)) - tf.eye(nei), self.filter_precision) + attn *= mask + output = tf.matmul(attn, V) + return output + + def _attention_layers( + self, + input_xyz, + layer_num, + shape_i, + outputs_size, + input_r, + dotr=False, + do_mask=False, + trainable=True + ): + sd_k = tf.sqrt(tf.cast(1., dtype=self.filter_precision)) + self.G = tf.reshape(input_xyz, (-1, shape_i[1] // 4, outputs_size[-1]))[0] + for i in range(layer_num): + with tf.variable_scope('attention_layer{}_'.format(i), reuse=tf.AUTO_REUSE): + # input_xyz_in = tf.nn.l2_normalize(input_xyz, -1) + Q_c = one_layer( + input_xyz, + self.att_n, + name='c_query', + reuse=tf.AUTO_REUSE, + seed=self.seed, + activation_fn=None, + precision=self.filter_precision, + trainable=trainable, + uniform_seed=self.uniform_seed) + K_c = one_layer( + input_xyz, + self.att_n, + name='c_key', + reuse=tf.AUTO_REUSE, + seed=self.seed, + activation_fn=None, + precision=self.filter_precision, + trainable=trainable, + uniform_seed=self.uniform_seed) + V_c = one_layer( + input_xyz, + self.att_n, + name='c_value', + reuse=tf.AUTO_REUSE, + seed=self.seed, + activation_fn=None, + precision=self.filter_precision, + trainable=trainable, + uniform_seed=self.uniform_seed) + # # natom x nei_type_i x out_size + # xyz_scatter = tf.reshape(xyz_scatter, (-1, shape_i[1] // 4, outputs_size[-1])) + # natom x nei_type_i x att_n + Q_c = tf.nn.l2_normalize(tf.reshape(Q_c, (-1, shape_i[1] // 4, self.att_n)), -1) + K_c = tf.nn.l2_normalize(tf.reshape(K_c, (-1, shape_i[1] // 4, self.att_n)), -1) + V_c = tf.nn.l2_normalize(tf.reshape(V_c, (-1, shape_i[1] // 4, self.att_n)), -1) + # Q_c = tf.reshape(Q_c, (-1, shape_i[1] // 4, self.att_n)) + # K_c = tf.reshape(K_c, (-1, shape_i[1] // 4, self.att_n)) + # V_c = tf.reshape(V_c, (-1, shape_i[1] // 4, self.att_n)) + self.qs[i] = Q_c[0] + self.ks[i] = K_c[0] + self.vs[i] = V_c[0] + + input_att = self._scaled_dot_attn(Q_c, K_c, V_c, sd_k, input_r, dotr=dotr, do_mask=do_mask, layer=i) + input_att = tf.reshape(input_att, (-1, self.att_n)) + + # A_c = tf.nn.softmax(tf.matmul(Q_c, K_c, transpose_b=True)/sd_k) + # # (natom x nei_type_i) x att_n + # input_att = tf.reshape(tf.matmul(A_c, V_c), (-1, self.att_n)) + + # (natom x nei_type_i) x out_size + input_xyz += one_layer( + input_att, + outputs_size[-1], + name='c_out', + reuse=tf.AUTO_REUSE, + seed=self.seed, + activation_fn=None, + precision=self.filter_precision, + trainable=trainable, + uniform_seed=self.uniform_seed) + # natom x nei_type_i x out_size + input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) + # input_xyz = self._feedforward(input_xyz, outputs_size[-1], self.att_n) + return input_xyz + + def _filter_lower( + self, + type_i, + type_input, + start_index, + incrs_index, + inputs, + type_embedding=None, + atype=None, + is_exclude=False, + activation_fn=None, + bavg=0.0, + stddev=1.0, + trainable=True, + suffix='', + name='filter_', + reuse=None + ): + """ + input env matrix, returns R.G + """ + outputs_size = [1] + self.filter_neuron + # cut-out inputs + # with natom x (nei_type_i x 4) + inputs_i = tf.slice(inputs, + [0, start_index * 4], + [-1, incrs_index * 4]) + shape_i = inputs_i.get_shape().as_list() + natom = tf.shape(inputs_i)[0] + # with (natom x nei_type_i) x 4 + inputs_reshape = tf.reshape(inputs_i, [-1, 4]) + # with (natom x nei_type_i) x 1 + xyz_scatter = tf.reshape(tf.slice(inputs_reshape, [0, 0], [-1, 1]), [-1, 1]) + assert atype is not None, 'atype must exist!!' + type_embedding = tf.cast(type_embedding, self.filter_precision) + xyz_scatter = self._lookup_type_embedding( + xyz_scatter, atype, type_embedding) + if self.compress: + raise RuntimeError('compression of attention descriptor is not supported at the moment') + # natom x 4 x outputs_size + if (not is_exclude): + with tf.variable_scope(name, reuse=reuse): + # with (natom x nei_type_i) x out_size + xyz_scatter = embedding_net( + xyz_scatter, + self.filter_neuron, + self.filter_precision, + activation_fn=activation_fn, + resnet_dt=self.filter_resnet_dt, + name_suffix=suffix, + stddev=stddev, + bavg=bavg, + seed=self.seed, + trainable=trainable, + uniform_seed=self.uniform_seed, + initial_variables=self.embedding_net_variables, + mixed_prec=self.mixed_prec) + if (not self.uniform_seed) and (self.seed is not None): self.seed += self.seed_shift + input_r = tf.slice(tf.reshape(inputs_i, (-1, shape_i[1] // 4, 4)), [0, 0, 1], [-1, -1, 3]) + input_r = tf.nn.l2_normalize(input_r, -1) + # natom x nei_type_i x out_size + xyz_scatter_att = tf.reshape( + self._attention_layers(xyz_scatter, self.attn_layer, shape_i, outputs_size, input_r, + dotr=self.attn_dotr, do_mask=self.attn_mask, trainable=trainable), + (-1, shape_i[1] // 4, outputs_size[-1])) + # xyz_scatter = tf.reshape(xyz_scatter, (-1, shape_i[1] // 4, outputs_size[-1])) + else: + # we can safely return the final xyz_scatter filled with zero directly + return tf.cast(tf.fill((natom, 4, outputs_size[-1]), 0.), self.filter_precision) + # When using tf.reshape(inputs_i, [-1, shape_i[1]//4, 4]) below + # [588 24] -> [588 6 4] correct + # but if sel is zero + # [588 0] -> [147 0 4] incorrect; the correct one is [588 0 4] + # So we need to explicitly assign the shape to tf.shape(inputs_i)[0] instead of -1 + return tf.matmul(tf.reshape(inputs_i, [natom, shape_i[1] // 4, 4]), xyz_scatter_att, transpose_a=True) + + @cast_precision + def _filter( + self, + inputs, + type_input, + natoms, + type_embedding=None, + atype=None, + activation_fn=tf.nn.tanh, + stddev=1.0, + bavg=0.0, + name='linear', + reuse=None, + trainable=True): + nframes = tf.shape(tf.reshape(inputs, [-1, natoms[0], self.ndescrpt]))[0] + # natom x (nei x 4) + shape = inputs.get_shape().as_list() + outputs_size = [1] + self.filter_neuron + outputs_size_2 = self.n_axis_neuron + all_excluded = all([(type_input, type_i) in self.exclude_types for type_i in range(self.ntypes)]) + if all_excluded: + # all types are excluded so result and qmat should be zeros + # we can safaly return a zero matrix... + # See also https://stackoverflow.com/a/34725458/9567349 + # result: natom x outputs_size x outputs_size_2 + # qmat: natom x outputs_size x 3 + natom = tf.shape(inputs)[0] + result = tf.cast(tf.fill((natom, outputs_size_2, outputs_size[-1]), 0.), GLOBAL_TF_FLOAT_PRECISION) + qmat = tf.cast(tf.fill((natom, outputs_size[-1], 3), 0.), GLOBAL_TF_FLOAT_PRECISION) + return result, qmat + + start_index = 0 + type_i = 0 + # natom x 4 x outputs_size + xyz_scatter_1 = self._filter_lower( + type_i, type_input, + start_index, np.cumsum(self.sel_a)[-1], + inputs, + type_embedding=type_embedding, + is_exclude=False, + activation_fn=activation_fn, + stddev=stddev, + bavg=bavg, + trainable=trainable, + name=name, + reuse=reuse, + atype=atype) + # natom x nei x outputs_size + # xyz_scatter = tf.concat(xyz_scatter_total, axis=1) + # natom x nei x 4 + # inputs_reshape = tf.reshape(inputs, [-1, shape[1]//4, 4]) + # natom x 4 x outputs_size + # xyz_scatter_1 = tf.matmul(inputs_reshape, xyz_scatter, transpose_a = True) + if self.original_sel is None: + # shape[1] = nnei * 4 + nnei = shape[1] / 4 + else: + nnei = tf.cast(tf.Variable(np.sum(self.original_sel), dtype=tf.int32, trainable=False, name="nnei"), + self.filter_precision) + xyz_scatter_1 = xyz_scatter_1 / nnei + # natom x 4 x outputs_size_2 + xyz_scatter_2 = tf.slice(xyz_scatter_1, [0, 0, 0], [-1, -1, outputs_size_2]) + # # natom x 3 x outputs_size_2 + # qmat = tf.slice(xyz_scatter_2, [0,1,0], [-1, 3, -1]) + # natom x 3 x outputs_size_1 + qmat = tf.slice(xyz_scatter_1, [0, 1, 0], [-1, 3, -1]) + # natom x outputs_size_1 x 3 + qmat = tf.transpose(qmat, perm=[0, 2, 1]) + # natom x outputs_size x outputs_size_2 + result = tf.matmul(xyz_scatter_1, xyz_scatter_2, transpose_a=True) + # natom x (outputs_size x outputs_size_2) + result = tf.reshape(result, [-1, outputs_size_2 * outputs_size[-1]]) + + return result, qmat diff --git a/deepmd/entrypoints/train.py b/deepmd/entrypoints/train.py index 4a67eee9d4..080867c38c 100755 --- a/deepmd/entrypoints/train.py +++ b/deepmd/entrypoints/train.py @@ -90,7 +90,10 @@ def train( jdata = normalize(jdata) - if not is_compress and not skip_neighbor_stat: + if jdata['model']['descriptor']['type'] in ['se_atten'] and isinstance(jdata['model']['descriptor']['sel'], list): + jdata['model']['descriptor']['sel'] = sum(jdata['model']['descriptor']['sel']) + + if not is_compress and not skip_neighbor_stat and jdata['model']['descriptor']['type'] not in ['se_atten']: jdata = update_sel(jdata) with open(output, "w") as fp: diff --git a/deepmd/fit/ener.py b/deepmd/fit/ener.py index 61d70045d8..4dd063a02e 100644 --- a/deepmd/fit/ener.py +++ b/deepmd/fit/ener.py @@ -168,7 +168,8 @@ def get_numb_aparam(self) -> int: return self.numb_fparam def compute_output_stats(self, - all_stat: dict + all_stat: dict, + large_batch_mode: bool = False ) -> None: """ Compute the ouput statistics @@ -180,9 +181,9 @@ def compute_output_stats(self, all_stat['energy'] of shape n_sys x n_batch x n_frame can be prepared by model.make_stat_input """ - self.bias_atom_e = self._compute_output_stats(all_stat, rcond = self.rcond) + self.bias_atom_e = self._compute_output_stats(all_stat, rcond=self.rcond, large_batch_mode=large_batch_mode) - def _compute_output_stats(self, all_stat, rcond = 1e-3): + def _compute_output_stats(self, all_stat, rcond=1e-3, large_batch_mode=False): data = all_stat['energy'] # data[sys_idx][batch_idx][frame_idx] sys_ener = np.array([]) @@ -193,11 +194,22 @@ def _compute_output_stats(self, all_stat, rcond = 1e-3): sys_data.append(data[ss][ii][jj]) sys_data = np.concatenate(sys_data) sys_ener = np.append(sys_ener, np.average(sys_data)) - data = all_stat['natoms_vec'] sys_tynatom = np.array([]) - nsys = len(data) - for ss in range(len(data)): - sys_tynatom = np.append(sys_tynatom, data[ss][0].astype(np.float64)) + if large_batch_mode: + data = all_stat['real_natoms_vec'] + nsys = len(data) + for ss in range(len(data)): + tmp_tynatom = [] + for ii in range(len(data[ss])): + for jj in range(len(data[ss][ii])): + tmp_tynatom.append(data[ss][ii][jj].astype(np.float64)) + tmp_tynatom = np.average(np.array(tmp_tynatom), axis=0) + sys_tynatom = np.append(sys_tynatom, tmp_tynatom) + else: + data = all_stat['natoms_vec'] + nsys = len(data) + for ss in range(len(data)): + sys_tynatom = np.append(sys_tynatom, data[ss][0].astype(np.float64)) sys_tynatom = np.reshape(sys_tynatom, [nsys,-1]) sys_tynatom = sys_tynatom[:,2:] if len(self.atom_ener) > 0: @@ -384,6 +396,11 @@ def build (self, if input_dict is None: input_dict = {} bias_atom_e = self.bias_atom_e + self.bias_atom_e_t = tf.get_variable('t_bias_atom_e', + self.bias_atom_e.shape, + dtype=GLOBAL_TF_FLOAT_PRECISION, + trainable=False, + initializer=tf.constant_initializer(self.bias_atom_e)) if self.numb_fparam > 0: if self.fparam_avg is None: self.fparam_avg = 0. @@ -452,12 +469,16 @@ def build (self, aparam = tf.reshape(aparam, [-1, self.numb_aparam * natoms[0]]) type_embedding = input_dict.get('type_embedding', None) + atype = input_dict.get('atype', None) if type_embedding is not None: - atype_embed = embed_atom_type(self.ntypes, natoms, type_embedding) - atype_embed = tf.tile(atype_embed,[tf.shape(inputs)[0],1]) + atype_nall = tf.reshape(atype, [-1, natoms[1]]) + self.atype_nloc = tf.reshape(tf.slice(atype_nall, [0, 0], [-1, natoms[0]]), [-1]) ## lammps will make error + atype_embed = tf.nn.embedding_lookup(type_embedding, self.atype_nloc) else: atype_embed = None + self.atype_embed = atype_embed + if atype_embed is None: start_index = 0 outs_list = [] @@ -495,6 +516,7 @@ def build (self, [tf.reshape(inputs,[-1,self.dim_descrpt]),atype_embed], axis=1 ) + self.tmp_input = inputs self.dim_descrpt = self.dim_descrpt + type_shape[1] inputs = tf.reshape(inputs, [-1, natoms[0], self.dim_descrpt]) final_layer = self._build_lower( @@ -503,11 +525,11 @@ def build (self, bias_atom_e=0.0, suffix=suffix, reuse=reuse ) outs = tf.reshape(final_layer, [tf.shape(inputs)[0], natoms[0]]) - # add atom energy bias; TF will broadcast to all batches - # tf.repeat is avaiable in TF>=2.1 or TF 1.15 - _TF_VERSION = Version(TF_VERSION) - if (Version('1.15') <= _TF_VERSION < Version('2') or _TF_VERSION >= Version('2.1')) and self.bias_atom_e is not None: - outs += tf.repeat(tf.Variable(self.bias_atom_e, dtype=self.fitting_precision, trainable=False, name="bias_atom_ei"), natoms[2:]) + # add bias + self.atom_ener_before = outs + self.add_type = tf.reshape(tf.nn.embedding_lookup(self.bias_atom_e_t, self.atype_nloc), [tf.shape(inputs)[0], natoms[0]]) + outs = outs + self.add_type + self.atom_ener_after = outs if self.tot_ener_zero: force_tot_ener = 0.0 diff --git a/deepmd/model/ener.py b/deepmd/model/ener.py index 471a0b4743..17fde2064c 100644 --- a/deepmd/model/ener.py +++ b/deepmd/model/ener.py @@ -92,23 +92,36 @@ def get_type_map (self) : def data_stat(self, data): all_stat = make_stat_input(data, self.data_stat_nbatch, merge_sys = False) m_all_stat = merge_sys_stat(all_stat) - self._compute_input_stat(m_all_stat, protection = self.data_stat_protect) - self._compute_output_stat(all_stat) + self._compute_input_stat(m_all_stat, protection=self.data_stat_protect, large_batch_mode=data.large_batch_mode) + self._compute_output_stat(all_stat, large_batch_mode=data.large_batch_mode) # self.bias_atom_e = data.compute_energy_shift(self.rcond) - def _compute_input_stat (self, all_stat, protection = 1e-2) : - self.descrpt.compute_input_stats(all_stat['coord'], - all_stat['box'], - all_stat['type'], - all_stat['natoms_vec'], - all_stat['default_mesh'], - all_stat) - self.fitting.compute_input_stats(all_stat, protection = protection) + def _compute_input_stat (self, all_stat, protection=1e-2, large_batch_mode=False): + if large_batch_mode: + self.descrpt.compute_input_stats(all_stat['coord'], + all_stat['box'], + all_stat['type'], + all_stat['natoms_vec'], + all_stat['default_mesh'], + all_stat, + large_batch_mode, + all_stat['real_natoms_vec']) + else: + self.descrpt.compute_input_stats(all_stat['coord'], + all_stat['box'], + all_stat['type'], + all_stat['natoms_vec'], + all_stat['default_mesh'], + all_stat) + self.fitting.compute_input_stats(all_stat, protection=protection) + + def _compute_output_stat (self, all_stat, large_batch_mode=False): + if large_batch_mode: + self.fitting.compute_output_stats(all_stat, large_batch_mode=large_batch_mode) + else: + self.fitting.compute_output_stats(all_stat) - def _compute_output_stat (self, all_stat) : - self.fitting.compute_output_stats(all_stat) - def build (self, coord_, atype_, @@ -158,6 +171,7 @@ def build (self, suffix = suffix, ) input_dict['type_embedding'] = type_embedding + input_dict['atype'] = atype_ if frz_model == None: dout \ @@ -195,6 +209,7 @@ def build (self, input_dict, reuse = reuse, suffix = suffix) + self.atom_ener = atom_ener if self.srtab is not None : sw_lambda, sw_deriv \ diff --git a/deepmd/train/trainer.py b/deepmd/train/trainer.py index 86edb8db78..b26e0b1550 100644 --- a/deepmd/train/trainer.py +++ b/deepmd/train/trainer.py @@ -69,17 +69,20 @@ def _init_param(self, jdata): # nvnmd self.nvnmd_param = jdata.get('nvnmd', {}) nvnmd_cfg.init_from_jdata(self.nvnmd_param) - nvnmd_cfg.init_from_deepmd_input(model_param) if nvnmd_cfg.enable: + nvnmd_cfg.init_from_deepmd_input(model_param) nvnmd_cfg.disp_message() nvnmd_cfg.save() # descriptor try: descrpt_type = descrpt_param['type'] + self.descrpt_type = descrpt_type except KeyError: raise KeyError('the type of descriptor should be set by `type`') + if descrpt_param['type'] in ['se_atten']: + descrpt_param['ntypes'] = len(model_param['type_map']) self.descrpt = Descriptor(**descrpt_param) # fitting net @@ -112,6 +115,11 @@ def _init_param(self, jdata): raise RuntimeError('unknow fitting type ' + fitting_type) # type embedding + use_linear = False + padding = False + if descrpt_type == 'se_atten': + use_linear = True + padding = True if typeebd_param is not None: self.typeebd = TypeEmbedNet( neuron=typeebd_param['neuron'], @@ -119,7 +127,16 @@ def _init_param(self, jdata): activation_function=typeebd_param['activation_function'], precision=typeebd_param['precision'], trainable=typeebd_param['trainable'], - seed=typeebd_param['seed'] + seed=typeebd_param['seed'], + use_linear=use_linear, + padding=padding + ) + elif descrpt_type == 'se_atten': + self.typeebd = TypeEmbedNet( + neuron=[2, 4, 8], + seed=1, + use_linear=use_linear, + padding=padding ) else: self.typeebd = None @@ -271,6 +288,9 @@ def build (self, stop_batch = 0) : self.ntypes = self.model.get_ntypes() self.stop_batch = stop_batch + if data.large_batch_mode: + assert self.descrpt_type in ['se_atten'], 'Data in large_batch_mode must use attention descriptor!' + assert self.fitting_type in ['ener'], 'Data in large_batch_mode must use ener fitting!' if self.numb_fparam > 0 : log.info("training with %d frame parameter(s)" % self.numb_fparam) @@ -585,7 +605,7 @@ def save_checkpoint(self, cur_batch: int): def get_feed_dict(self, batch, is_training): feed_dict = {} for kk in batch.keys(): - if kk == 'find_type' or kk == 'type': + if kk == 'find_type' or kk == 'type' or kk == 'real_natoms_vec': continue if 'find_' in kk: feed_dict[self.place_holders[kk]] = batch[kk] diff --git a/deepmd/utils/argcheck.py b/deepmd/utils/argcheck.py index e7c7edb170..e5df77ad26 100644 --- a/deepmd/utils/argcheck.py +++ b/deepmd/utils/argcheck.py @@ -239,6 +239,48 @@ def descrpt_hybrid_args(): ] +@descrpt_args_plugin.register("se_atten") +def descrpt_se_atten_args(): + doc_sel = 'This parameter set the number of selected neighbors. Note that this parameter is a little different from that in other descriptors. Instead of separating each type of atoms, only the summation matters. And this number is highly related with the efficiency, thus one should not make it too large. Usually 200 or less is enough, far away from the GPU limitation 4096. It can be:\n\n\ + - `int`. The maximum number of neighbor atoms to be considered. We recommend it to be less than 200. \n\n\ + - `List[int]`. The length of the list should be the same as the number of atom types in the system. `sel[i]` gives the selected number of type-i neighbors. Only the summation of `sel[i]` matters, and it is recommended to be less than 200.' + doc_rcut = 'The cut-off radius.' + doc_rcut_smth = 'Where to start smoothing. For example the 1/r term is smoothed from `rcut` to `rcut_smth`' + doc_neuron = 'Number of neurons in each hidden layers of the embedding net. When two layers are of the same size or one layer is twice as large as the previous layer, a skip connection is built.' + doc_axis_neuron = 'Size of the submatrix of G (embedding matrix).' + doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' + doc_type_one_side = 'Try to build N_types embedding nets. Otherwise, building N_types^2 embedding nets' + doc_precision = f'The precision of the embedding net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' + doc_trainable = 'If the parameters in the embedding net is trainable' + doc_seed = 'Random seed for parameter initialization' + doc_exclude_types = 'The excluded pairs of types which have no interaction with each other. For example, `[[0, 1]]` means no interaction between type 0 and type 1.' + doc_set_davg_zero = 'Set the normalization average to zero. This option should be set when `atom_ener` in the energy fitting is used' + doc_attn = 'The length of hidden vectors in attention layers' + doc_attn_layer = 'The number of attention layers' + doc_attn_dotr = 'Whether to do dot product with the normalized relative coordinates' + doc_attn_mask = 'Whether to do mask on the diagonal in the attention matrix' + + return [ + Argument("sel", [int, list], optional=True, default=200, doc=doc_sel), + Argument("rcut", float, optional=True, default=6.0, doc=doc_rcut), + Argument("rcut_smth", float, optional=True, default=0.5, doc=doc_rcut_smth), + Argument("neuron", list, optional=True, default=[10, 20, 40], doc=doc_neuron), + Argument("axis_neuron", int, optional=True, default=4, alias=['n_axis_neuron'], doc=doc_axis_neuron), + Argument("activation_function", str, optional=True, default='tanh', doc=doc_activation_function), + Argument("resnet_dt", bool, optional=True, default=False, doc=doc_resnet_dt), + Argument("type_one_side", bool, optional=True, default=False, doc=doc_type_one_side), + Argument("precision", str, optional=True, default="default", doc=doc_precision), + Argument("trainable", bool, optional=True, default=True, doc=doc_trainable), + Argument("seed", [int, None], optional=True, doc=doc_seed), + Argument("exclude_types", list, optional=True, default=[], doc=doc_exclude_types), + Argument("set_davg_zero", bool, optional=True, default=False, doc=doc_set_davg_zero), + Argument("attn", int, optional=True, default=100, doc=doc_attn), + Argument("attn_layer", int, optional=True, default=4, doc=doc_attn_layer), + Argument("attn_dotr", bool, optional=True, default=False, doc=doc_attn_dotr), + Argument("attn_mask", bool, optional=True, default=False, doc=doc_attn_mask) + ] + def descrpt_variant_type_args(exclude_hybrid: bool = False) -> Variant: link_lf = make_link('loc_frame', 'model/descriptor[loc_frame]') link_se_e2_a = make_link('se_e2_a', 'model/descriptor[se_e2_a]') @@ -246,12 +288,14 @@ def descrpt_variant_type_args(exclude_hybrid: bool = False) -> Variant: link_se_e3 = make_link('se_e3', 'model/descriptor[se_e3]') link_se_a_tpe = make_link('se_a_tpe', 'model/descriptor[se_a_tpe]') link_hybrid = make_link('hybrid', 'model/descriptor[hybrid]') + link_se_atten = make_link('se_atten', 'model/descriptor[se_atten]') doc_descrpt_type = f'The type of the descritpor. See explanation below. \n\n\ - `loc_frame`: Defines a local frame at each atom, and the compute the descriptor as local coordinates under this frame.\n\n\ - `se_e2_a`: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor.\n\n\ - `se_e2_r`: Used by the smooth edition of Deep Potential. Only the distance between atoms is used to construct the descriptor.\n\n\ - `se_e3`: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor. Three-body embedding will be used by this descriptor.\n\n\ - `se_a_tpe`: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor. Type embedding will be used by this descriptor.\n\n\ +- `se_atten`: Used by the smooth edition of Deep Potential. The full relative coordinates are used to construct the descriptor. Attention mechanism will be used by this descriptor.\n\n\ - `hybrid`: Concatenate of a list of descriptors as a new descriptor.' return Variant("type", descrpt_args_plugin.get_all_argument(), doc = doc_descrpt_type) diff --git a/deepmd/utils/data.py b/deepmd/utils/data.py index 0709352d7a..655e8bdb78 100644 --- a/deepmd/utils/data.py +++ b/deepmd/utils/data.py @@ -48,6 +48,7 @@ def __init__ (self, root = DPPath(sys_path) self.dirs = root.glob(set_prefix + ".*") self.dirs.sort() + self.large_batch_mode = self._check_mode(sys_path) # load atom type self.atom_type = self._load_type(root) self.natoms = len(self.atom_type) @@ -408,8 +409,7 @@ def _shuffle_data (self, if type(data[kk]) == np.ndarray and \ len(data[kk].shape) == 2 and \ data[kk].shape[0] == nframes and \ - not('find_' in kk) and \ - 'type' != kk: + not('find_' in kk): ret[kk] = data[kk][idx] else : ret[kk] = data[kk] @@ -430,7 +430,6 @@ def _load_set(self, set_name: DPPath) : assert(coord.shape[1] == self.data_dict['coord']['ndof'] * self.natoms) # load keys data = {} - data['type'] = np.tile (self.atom_type[self.idx_map], (nframes, 1)) for kk in self.data_dict.keys(): if self.data_dict[kk]['reduce'] is None : data['find_'+kk], data[kk] \ @@ -453,6 +452,17 @@ def _load_set(self, set_name: DPPath) : tmp_in = data[k_in].astype(GLOBAL_ENER_FLOAT_PRECISION) data[kk] = np.sum(np.reshape(tmp_in, [nframes, self.natoms, ndof]), axis = 1) + if self.large_batch_mode: + type_path = set_name / "real_atom_types.npy" + data['type'] = type_path.load_numpy().astype(np.int32).reshape([nframes, -1]) + natoms = data['type'].shape[1] + vec_path = set_name / "real_atom_numbs.npy" + tmp = vec_path.load_numpy().astype(np.int32).reshape([nframes, -1]) + data['real_natoms_vec'] = np.concatenate((np.tile(np.array([natoms, natoms], dtype=np.int32), (nframes, 1)), + tmp), axis=-1) + else: + data['type'] = np.tile(self.atom_type[self.idx_map], (nframes, 1)) + return data @@ -524,6 +534,12 @@ def _check_pbc(self, sys_path: DPPath): pbc = False return pbc + def _check_mode(self, sys_path): + large_batch_mode = False + if os.path.isfile(os.path.join(sys_path, 'set.000', 'real_atom_types.npy')): + large_batch_mode = True + return large_batch_mode + class DataSets (object): """ diff --git a/deepmd/utils/data_system.py b/deepmd/utils/data_system.py index 656a7a2e7b..98969c5d9b 100644 --- a/deepmd/utils/data_system.py +++ b/deepmd/utils/data_system.py @@ -84,6 +84,7 @@ def __init__ (self, modifier = modifier, trn_all_set = trn_all_set )) + self.large_batch_mode = self.data_systems[0].large_batch_mode # batch size self.batch_size = batch_size if isinstance(self.batch_size, int): diff --git a/deepmd/utils/type_embed.py b/deepmd/utils/type_embed.py index 5d5b5c9888..583c9b85d5 100644 --- a/deepmd/utils/type_embed.py +++ b/deepmd/utils/type_embed.py @@ -82,6 +82,8 @@ def __init__( trainable: bool = True, seed: int = None, uniform_seed: bool = False, + use_linear: bool = False, + padding: bool = False, )->None: """ Constructor @@ -94,6 +96,8 @@ def __init__( self.trainable = trainable self.uniform_seed = uniform_seed self.type_embedding_net_variables = None + self.use_linear = use_linear + self.padding = padding def build( @@ -126,18 +130,33 @@ def build( ebd_type = tf.cast(tf.one_hot(tf.cast(types,dtype=tf.int32),int(ntypes)), self.filter_precision) ebd_type = tf.reshape(ebd_type, [-1, ntypes]) name = 'type_embed_net' + suffix - with tf.variable_scope(name, reuse=reuse): - ebd_type = embedding_net( + if not self.use_linear: + with tf.variable_scope(name, reuse=reuse): + ebd_type = embedding_net( + ebd_type, + self.neuron, + activation_fn = self.filter_activation_fn, + precision = self.filter_precision, + resnet_dt = self.filter_resnet_dt, + seed = self.seed, + trainable = self.trainable, + initial_variables = self.type_embedding_net_variables, + uniform_seed = self.uniform_seed) + else: + ebd_type = one_layer( ebd_type, - self.neuron, - activation_fn = self.filter_activation_fn, - precision = self.filter_precision, - resnet_dt = self.filter_resnet_dt, - seed = self.seed, - trainable = self.trainable, - initial_variables = self.type_embedding_net_variables, - uniform_seed = self.uniform_seed) - ebd_type = tf.reshape(ebd_type, [-1, self.neuron[-1]]) # nnei * neuron[-1] + self.neuron[-1], + name=name, + reuse=reuse, + seed=self.seed, + activation_fn=None, + precision=self.filter_precision, + trainable = self.trainable, + uniform_seed=self.uniform_seed) + ebd_type = tf.reshape(ebd_type, [-1, self.neuron[-1]]) # ntypes * neuron[-1] + if self.padding: + last_type = tf.cast(tf.zeros([1, self.neuron[-1]]), self.filter_precision) + ebd_type = tf.concat([ebd_type, last_type], 0) self.ebd_type = tf.identity(ebd_type, name ='t_typeebd') return self.ebd_type diff --git a/examples/water/se_atten/input.json b/examples/water/se_atten/input.json new file mode 100644 index 0000000000..2d54eaa1b6 --- /dev/null +++ b/examples/water/se_atten/input.json @@ -0,0 +1,70 @@ +{ + "_comment": " model parameters", + "model": { + "type_map": ["O", "H"], + "descriptor" :{ + "type": "se_atten", + "sel": 120, + "rcut_smth": 0.50, + "rcut": 6.00, + "neuron": [25, 50, 100], + "resnet_dt": false, + "axis_neuron": 16, + "seed": 1, + "attn": 128, + "attn_layer": 2, + "attn_dotr": true, + "attn_mask": false, + "_comment": " that's all" + }, + "fitting_net" : { + "neuron": [240, 240, 240], + "resnet_dt": true, + "seed": 1, + "_comment": " that's all" + }, + "_comment": " that's all" + }, + + "learning_rate" :{ + "type": "exp", + "decay_steps": 5000, + "start_lr": 0.001, + "stop_lr": 3.51e-8, + "_comment": "that's all" + }, + + "loss" :{ + "type": "ener", + "start_pref_e": 0.02, + "limit_pref_e": 1, + "start_pref_f": 1000, + "limit_pref_f": 1, + "start_pref_v": 0, + "limit_pref_v": 0, + "_comment": " that's all" + }, + + "training" : { + "training_data": { + "systems": ["../data/data_0/", "../data/data_1/", "../data/data_2/"], + "batch_size": "auto", + "_comment": "that's all" + }, + "validation_data":{ + "systems": ["../data/data_3"], + "batch_size": 1, + "numb_btch": 3, + "_comment": "that's all" + }, + "numb_steps": 1000000, + "seed": 10, + "disp_file": "lcurve.out", + "disp_freq": 100, + "save_freq": 1000, + "_comment": "that's all" + }, + + "_comment": "that's all" +} + diff --git a/source/lib/include/neighbor_list.h b/source/lib/include/neighbor_list.h index 53e6d83d2c..13c0a40e1f 100644 --- a/source/lib/include/neighbor_list.h +++ b/source/lib/include/neighbor_list.h @@ -85,6 +85,18 @@ build_nlist_cpu( const int & mem_size, const float & rcut); +template +void use_nei_info_cpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map); + #if GOOGLE_CUDA || TENSORFLOW_USE_ROCM /** *@brief Convert the a host memory InputNlist to a device memory InputNlist @@ -140,6 +152,18 @@ build_nlist_gpu( const int & mem_size, const float & rcut); +template +void use_nei_info_gpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map); + #endif // GOOGLE_CUDA @@ -167,6 +191,18 @@ build_nlist_gpu_rocm( const int & mem_size, const float & rcut); +template +void use_nei_info_gpu_rocm( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map); + #endif // TENSORFLOW_USE_ROCM } // namespace deepmd diff --git a/source/lib/include/prod_env_mat.h b/source/lib/include/prod_env_mat.h index 58f1ae8485..418f5e927c 100644 --- a/source/lib/include/prod_env_mat.h +++ b/source/lib/include/prod_env_mat.h @@ -41,6 +41,25 @@ void prod_env_mat_r_cpu( const float rcut_smth, const std::vector sec); +template +void prod_env_mat_a_mix_cpu( + FPTYPE * em, + FPTYPE * em_deriv, + FPTYPE * rij, + int * nlist, + const FPTYPE * coord, + const int * f_type, + const int * type, + const InputNlist & inlist, + const int max_nbor_size, + const FPTYPE * avg, + const FPTYPE * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec); + #if GOOGLE_CUDA template void prod_env_mat_a_gpu_cuda( @@ -82,6 +101,27 @@ void prod_env_mat_r_gpu_cuda( const float rcut_smth, const std::vector sec); +template +void prod_env_mat_a_mix_gpu_cuda( + FPTYPE * em, + FPTYPE * em_deriv, + FPTYPE * rij, + int * nlist, + const FPTYPE * coord, + const int * f_type, + const int * type, + const InputNlist & gpu_inlist, + int * array_int, + unsigned long long * array_longlong, + const int max_nbor_size, + const FPTYPE * avg, + const FPTYPE * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec); + void env_mat_nbor_update( InputNlist &inlist, InputNlist &gpu_inlist, @@ -132,6 +172,27 @@ void prod_env_mat_r_gpu_rocm( const float rcut_smth, const std::vector sec); +template +void prod_env_mat_a_mix_gpu_rocm( + FPTYPE * em, + FPTYPE * em_deriv, + FPTYPE * rij, + int * nlist, + const FPTYPE * coord, + const int * f_type, + const int * type, + const InputNlist & gpu_inlist, + int * array_int, + unsigned long long * array_longlong, + const int max_nbor_size, + const FPTYPE * avg, + const FPTYPE * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec); + void env_mat_nbor_update( InputNlist &inlist, InputNlist &gpu_inlist, diff --git a/source/lib/src/cuda/neighbor_list.cu b/source/lib/src/cuda/neighbor_list.cu index 100fcd6aca..eb4466786b 100644 --- a/source/lib/src/cuda/neighbor_list.cu +++ b/source/lib/src/cuda/neighbor_list.cu @@ -144,6 +144,60 @@ __global__ void map_nlist( } } +template +__global__ void map_nei_info( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes +) +{ + int atom_idx=blockIdx.x; + int nei_idx=blockIdx.y*blockDim.y+threadIdx.y; + if(nei_idx>=nnei){return;} + int nlist_idx=atom_idx*nnei+nei_idx; + int nlist_item=nlist[nlist_idx]; + int temp=0; + if(nlist_item!=-1){ + temp=nlist_map[nlist_item]; + nlist[nlist_idx]=temp; + ntype[nlist_idx]=type[temp]; + nmask[nlist_idx]=1.; + } + else{ + ntype[nlist_idx]=ntypes; + } +} + +template +__global__ void map_nei_info_noconvert( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int nloc, + const int nnei, + const int ntypes +) +{ + int atom_idx=blockIdx.x; + int nei_idx=blockIdx.y*blockDim.y+threadIdx.y; + if(nei_idx>=nnei){return;} + int nlist_idx=atom_idx*nnei+nei_idx; + int nlist_item=nlist[nlist_idx]; + if(nlist_item!=-1){ + ntype[nlist_idx]=type[nlist_item]; + nmask[nlist_idx]=1.; + } + else{ + ntype[nlist_idx]=ntypes; + } +} + namespace deepmd { template int build_nlist_gpu( @@ -220,6 +274,35 @@ void use_nlist_map( DPErrcheck(cudaDeviceSynchronize()); } +template +void use_nei_info_gpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map) +{ + int nblock=(nnei+TPB-1)/TPB; + dim3 block_grid(nloc, nblock); + dim3 thread_grid(1, TPB); + DPErrcheck(cudaMemset(ntype, 0, sizeof(int) * nloc * nnei)); + DPErrcheck(cudaMemset(nmask, 0, sizeof(FPTYPE) * nloc * nnei)); + if (b_nlist_map){ + map_nei_info<<>>(nlist, ntype, nmask, type, nlist_map, nloc, nnei, ntypes); + } + else{ + map_nei_info_noconvert<<>>(nlist, ntype, nmask, type, nloc, nnei, ntypes); + } + DPErrcheck(cudaGetLastError()); + DPErrcheck(cudaDeviceSynchronize()); +} + template int build_nlist_gpu(InputNlist & nlist, int * max_list_size, int * nlist_data, const float * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); template int build_nlist_gpu(InputNlist & nlist, int * max_list_size, int * nlist_data, const double * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); +template void use_nei_info_gpu(int * nlist, int * ntype, float * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); +template void use_nei_info_gpu(int * nlist, int * ntype, double * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); } \ No newline at end of file diff --git a/source/lib/src/cuda/prod_env_mat.cu b/source/lib/src/cuda/prod_env_mat.cu index 93a2b6a787..05c42df8e5 100644 --- a/source/lib/src/cuda/prod_env_mat.cu +++ b/source/lib/src/cuda/prod_env_mat.cu @@ -670,6 +670,46 @@ void prod_env_mat_r_gpu_cuda( DPErrcheck(cudaDeviceSynchronize()); } +template +void prod_env_mat_a_mix_gpu_cuda( + FPTYPE * em, + FPTYPE * em_deriv, + FPTYPE * rij, + int * nlist, + const FPTYPE * coord, + const int * f_type, + const int * type, + const InputNlist & gpu_inlist, + int * array_int, + uint_64 * array_longlong, + const int max_nbor_size, + const FPTYPE * avg, + const FPTYPE * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec) +{ + const int nnei = sec.back(); + const int ndescrpt = nnei * 4; + DPErrcheck(cudaMemset(em, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt)); + DPErrcheck(cudaMemset(em_deriv, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt * 3)); + DPErrcheck(cudaMemset(rij, 0, sizeof(FPTYPE) * int_64(nloc) * nnei * 3)); + + format_nbor_list_gpu_cuda( + nlist, + coord, f_type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); + nborErrcheck(cudaGetLastError()); + nborErrcheck(cudaDeviceSynchronize()); + + compute_env_mat_a <<>> ( + em, em_deriv, rij, + coord, avg, std, type, nlist, nnei, rcut_smth, rcut); + DPErrcheck(cudaGetLastError()); + DPErrcheck(cudaDeviceSynchronize()); +} + template void test_encoding_decoding_nbor_info_gpu_cuda( uint_64 * key, @@ -692,6 +732,8 @@ template void prod_env_mat_a_gpu_cuda(float * em, float * em_deriv, float template void prod_env_mat_a_gpu_cuda(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void prod_env_mat_r_gpu_cuda(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void prod_env_mat_r_gpu_cuda(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); +template void prod_env_mat_a_mix_gpu_cuda(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); +template void prod_env_mat_a_mix_gpu_cuda(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void format_nbor_list_gpu_cuda(int * nlist, const float * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void format_nbor_list_gpu_cuda(int * nlist, const double * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void test_encoding_decoding_nbor_info_gpu_cuda(uint_64 * key, int * out_type, int * out_index, const int * in_type, const float * in_dist, const int * in_index, const int size_of_array); diff --git a/source/lib/src/neighbor_list.cc b/source/lib/src/neighbor_list.cc index cae7630430..7d9c3a0552 100644 --- a/source/lib/src/neighbor_list.cc +++ b/source/lib/src/neighbor_list.cc @@ -820,6 +820,56 @@ build_nlist_cpu( return 0; } +template +void +deepmd:: +use_nei_info_cpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map) +{ + if(b_nlist_map){ + for (int ii = 0; ii < nloc; ++ii){ + for (int jj = 0; jj < nnei; ++jj){ + int nlist_idx = ii*nnei+jj; + int record = nlist[nlist_idx]; + if (record >= 0){ + int temp = nlist_map[record]; + nlist[nlist_idx] = temp; + ntype[nlist_idx]=type[temp]; + nmask[nlist_idx]=1.; + } + else{ + ntype[nlist_idx]=ntypes; + nmask[nlist_idx]=0.; + } + } + } + } + else{ + for (int ii = 0; ii < nloc; ++ii){ + for (int jj = 0; jj < nnei; ++jj){ + int nlist_idx = ii*nnei+jj; + int record = nlist[nlist_idx]; + if (record >= 0){ + ntype[nlist_idx]=type[record]; + nmask[nlist_idx]=1.; + } + else{ + ntype[nlist_idx]=ntypes; + nmask[nlist_idx]=0.; + } + } + } + } +} + template int deepmd:: @@ -844,6 +894,34 @@ build_nlist_cpu( const int & mem_size, const float & rcut); +template +void +deepmd:: +use_nei_info_cpu( + int * nlist, + int * ntype, + double * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map); + +template +void +deepmd:: +use_nei_info_cpu( + int * nlist, + int * ntype, + float * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map); + #if GOOGLE_CUDA || TENSORFLOW_USE_ROCM void deepmd::convert_nlist_gpu_device( InputNlist & gpu_nlist, diff --git a/source/lib/src/prod_env_mat.cc b/source/lib/src/prod_env_mat.cc index 303542699c..12270dd832 100644 --- a/source/lib/src/prod_env_mat.cc +++ b/source/lib/src/prod_env_mat.cc @@ -175,6 +175,111 @@ prod_env_mat_r_cpu( } } +template +void +deepmd:: +prod_env_mat_a_mix_cpu( + FPTYPE * em, + FPTYPE * em_deriv, + FPTYPE * rij, + int * nlist, + const FPTYPE * coord, + const int * f_type, + const int * type, + const InputNlist & inlist, + const int max_nbor_size, + const FPTYPE * avg, + const FPTYPE * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec) +{ + const int nnei = sec.back(); + const int nem = nnei * 4; + memset(em, 0.0, sizeof(FPTYPE) * nloc * nem); + memset(em_deriv, 0.0, sizeof(FPTYPE) * nloc * nem * 3); + memset(rij, 0.0, sizeof(FPTYPE) * nloc * nnei * 3); + + // set & normalize coord + std::vector d_coord3(nall * 3); + for (int ii = 0; ii < nall; ++ii) { + for (int dd = 0; dd < 3; ++dd) { + d_coord3[ii * 3 + dd] = coord[ii * 3 + dd]; + } + } + + // set type + std::vector d_f_type (nall); + std::vector d_type (nall); + for (int ii = 0; ii < nall; ++ii) { + d_f_type[ii] = f_type[ii]; + d_type[ii] = type[ii]; + } + + // build nlist + std::vector > d_nlist_a(nloc); + + assert(nloc == inlist.inum); + for (unsigned ii = 0; ii < nloc; ++ii) { + d_nlist_a[ii].reserve(max_nbor_size); + } + for (unsigned ii = 0; ii < nloc; ++ii) { + int i_idx = inlist.ilist[ii]; + for(unsigned jj = 0; jj < inlist.numneigh[ii]; ++jj){ + int j_idx = inlist.firstneigh[ii][jj]; + d_nlist_a[i_idx].push_back (j_idx); + } + } + +#pragma omp parallel for + for (int ii = 0; ii < nloc; ++ii) { + std::vector fmt_nlist_a; + int ret = format_nlist_i_cpu(fmt_nlist_a, d_coord3, d_f_type, ii, d_nlist_a[ii], rcut, sec); + std::vector d_em_a; + std::vector d_em_a_deriv; + std::vector d_em_r; + std::vector d_em_r_deriv; + std::vector d_rij_a; + env_mat_a_cpu (d_em_a, d_em_a_deriv, d_rij_a, d_coord3, d_f_type, ii, fmt_nlist_a, sec, rcut_smth, rcut); + + // check sizes + assert (d_em_a.size() == nem); + assert (d_em_a_deriv.size() == nem * 3); + assert (d_rij_a.size() == nnei * 3); + assert (fmt_nlist_a.size() == nnei); + // record outputs + for (int jj = 0; jj < nnei; ++jj) { + int temp_nei = fmt_nlist_a[jj]; + nlist[ii * nnei + jj] = temp_nei; + if(temp_nei >= 0){ + for (int kk = 0; kk < 3; ++kk){ + rij[ii * nnei * 3 + jj*3 + kk] = d_rij_a[jj*3 + kk]; + } + for (int kk = 0; kk < 4; ++kk) { + em[ii * nem + jj * 4 + kk] = (d_em_a[jj * 4 + kk] - avg[d_type[ii] * nem + jj * 4 + kk]) / std[d_type[ii] * nem + jj * 4 + kk]; + } + for (int kk = 0; kk < 12; ++kk) { + em_deriv[ii * nem * 3 + jj * 4 * 3 + kk] = d_em_a_deriv[jj * 4 * 3 + kk] / std[d_type[ii] * nem + jj * 4 + kk / 3]; + } + } + } + // for (int jj = 0; jj < nem; ++jj) { + // em[ii * nem + jj] = (d_em_a[jj] - avg[d_type[ii] * nem + jj]) / std[d_type[ii] * nem + jj]; + // } + // for (int jj = 0; jj < nem * 3; ++jj) { + // em_deriv[ii * nem * 3 + jj] = d_em_a_deriv[jj] / std[d_type[ii] * nem + jj / 3]; + // } + // for (int jj = 0; jj < nnei * 3; ++jj) { + // rij[ii * nnei * 3 + jj] = d_rij_a[jj]; + // } + // for (int jj = 0; jj < nnei; ++jj) { + // nlist[ii * nnei + jj] = fmt_nlist_a[jj]; + // } + } +} + template void @@ -256,6 +361,48 @@ prod_env_mat_r_cpu( const float rcut_smth, const std::vector sec); +template +void +deepmd:: +prod_env_mat_a_mix_cpu( + double * em, + double * em_deriv, + double * rij, + int * nlist, + const double * coord, + const int * f_type, + const int * type, + const InputNlist & inlist, + const int max_nbor_size, + const double * avg, + const double * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec); + +template +void +deepmd:: +prod_env_mat_a_mix_cpu( + float * em, + float * em_deriv, + float * rij, + int * nlist, + const float * coord, + const int * f_type, + const int * type, + const InputNlist & inlist, + const int max_nbor_size, + const float * avg, + const float * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec); + #if GOOGLE_CUDA || TENSORFLOW_USE_ROCM void deepmd::env_mat_nbor_update( InputNlist &inlist, diff --git a/source/lib/src/rocm/neighbor_list.hip.cu b/source/lib/src/rocm/neighbor_list.hip.cu index 795bdd59d3..eaf35f4812 100644 --- a/source/lib/src/rocm/neighbor_list.hip.cu +++ b/source/lib/src/rocm/neighbor_list.hip.cu @@ -144,6 +144,60 @@ __global__ void map_nlist( } } +template +__global__ void map_nei_info( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes +) +{ + int atom_idx=blockIdx.x; + int nei_idx=blockIdx.y*blockDim.y+threadIdx.y; + if(nei_idx>=nnei){return;} + int nlist_idx=atom_idx*nnei+nei_idx; + int nlist_item=nlist[nlist_idx]; + int temp=0; + if(nlist_item!=-1){ + temp=nlist_map[nlist_item]; + nlist[nlist_idx]=temp; + ntype[nlist_idx]=type[temp]; + nmask[nlist_idx]=1.; + } + else{ + ntype[nlist_idx]=ntypes; + } +} + +template +__global__ void map_nei_info_noconvert( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int nloc, + const int nnei, + const int ntypes +) +{ + int atom_idx=blockIdx.x; + int nei_idx=blockIdx.y*blockDim.y+threadIdx.y; + if(nei_idx>=nnei){return;} + int nlist_idx=atom_idx*nnei+nei_idx; + int nlist_item=nlist[nlist_idx]; + if(nlist_item!=-1){ + ntype[nlist_idx]=type[nlist_item]; + nmask[nlist_idx]=1.; + } + else{ + ntype[nlist_idx]=ntypes; + } +} + namespace deepmd { template int build_nlist_gpu_rocm( @@ -221,6 +275,35 @@ void use_nlist_map( DPErrcheck(hipDeviceSynchronize()); } +template +void use_nei_info_gpu_rocm( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * nlist_map, + const int nloc, + const int nnei, + const int ntypes, + const bool b_nlist_map) +{ + int nblock=(nnei+TPB-1)/TPB; + dim3 block_grid(nloc, nblock); + dim3 thread_grid(1, TPB); + DPErrcheck(hipMemset(ntype, 0, sizeof(int) * nloc * nnei)); + DPErrcheck(hipMemset(nmask, 0, sizeof(FPTYPE) * nloc * nnei)); + if (b_nlist_map){ + hipLaunchKernelGGL(map_nei_info, block_grid, thread_grid, 0, 0, nlist, ntype, nmask, type, nlist_map, nloc, nnei, ntypes); + } + else{ + hipLaunchKernelGGL(map_nei_info_noconvert, block_grid, thread_grid, 0, 0, nlist, ntype, nmask, type, nloc, nnei, ntypes); + } + DPErrcheck(hipGetLastError()); + DPErrcheck(hipDeviceSynchronize()); +} + template int build_nlist_gpu_rocm(InputNlist & nlist, int * max_list_size, int * nlist_data, const float * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); template int build_nlist_gpu_rocm(InputNlist & nlist, int * max_list_size, int * nlist_data, const double * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); +template void use_nei_info_gpu_rocm(int * nlist, int * ntype, float * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); +template void use_nei_info_gpu_rocm(int * nlist, int * ntype, double * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); } \ No newline at end of file diff --git a/source/lib/src/rocm/prod_env_mat.hip.cu b/source/lib/src/rocm/prod_env_mat.hip.cu index 506a844a04..aa58ea9e24 100644 --- a/source/lib/src/rocm/prod_env_mat.hip.cu +++ b/source/lib/src/rocm/prod_env_mat.hip.cu @@ -668,6 +668,46 @@ void prod_env_mat_r_gpu_rocm( DPErrcheck(hipDeviceSynchronize()); } +template +void prod_env_mat_a_mix_gpu_rocm( + FPTYPE * em, + FPTYPE * em_deriv, + FPTYPE * rij, + int * nlist, + const FPTYPE * coord, + const int * f_type, + const int * type, + const InputNlist & gpu_inlist, + int * array_int, + uint_64 * array_longlong, + const int max_nbor_size, + const FPTYPE * avg, + const FPTYPE * std, + const int nloc, + const int nall, + const float rcut, + const float rcut_smth, + const std::vector sec) +{ + const int nnei = sec.back(); + const int ndescrpt = nnei * 4; + DPErrcheck(hipMemset(em, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt)); + DPErrcheck(hipMemset(em_deriv, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt * 3)); + DPErrcheck(hipMemset(rij, 0, sizeof(FPTYPE) * int_64(nloc) * nnei * 3)); + + format_nbor_list_gpu_rocm( + nlist, + coord, f_type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); + nborErrcheck(hipGetLastError()); + nborErrcheck(hipDeviceSynchronize()); + + hipLaunchKernelGGL(HIP_KERNEL_NAME(compute_env_mat_a), nloc, TPB, 0, 0, + em, em_deriv, rij, + coord, avg, std, type, nlist, nnei, rcut_smth, rcut); + DPErrcheck(hipGetLastError()); + DPErrcheck(hipDeviceSynchronize()); +} + template void test_encoding_decoding_nbor_info_gpu_rocm( uint_64 * key, @@ -690,6 +730,8 @@ template void prod_env_mat_a_gpu_rocm(float * em, float * em_deriv, float template void prod_env_mat_a_gpu_rocm(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void prod_env_mat_r_gpu_rocm(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void prod_env_mat_r_gpu_rocm(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); +template void prod_env_mat_a_mix_gpu_rocm(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); +template void prod_env_mat_a_mix_gpu_rocm(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void format_nbor_list_gpu_rocm(int * nlist, const float * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void format_nbor_list_gpu_rocm(int * nlist, const double * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void test_encoding_decoding_nbor_info_gpu_rocm(uint_64 * key, int * out_type, int * out_index, const int * in_type, const float * in_dist, const int * in_index, const int size_of_array); diff --git a/source/lib/tests/test_env_mat_a_mix.cc b/source/lib/tests/test_env_mat_a_mix.cc new file mode 100644 index 0000000000..4a83c917fb --- /dev/null +++ b/source/lib/tests/test_env_mat_a_mix.cc @@ -0,0 +1,1048 @@ +#include +#include +#include "fmt_nlist.h" +#include "env_mat.h" +#include "prod_env_mat.h" +#include "neighbor_list.h" +#include "device.h" + +class TestEnvMatAMix : public ::testing::Test +{ +protected: + std::vector posi = {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 f_atype = {0, 0, 0, 0, 0, 0}; + std::vector posi_cpy; +// std::vector atype_cpy; + std::vector f_atype_cpy; + int nloc, nall; + double rc = 6; + double rc_smth = 0.8; + SimulationRegion region; + std::vector mapping, ncell, ngcell; + std::vector sec_a = {0, 20}; + std::vector sec_r = {0, 0}; + std::vector nat_stt, ext_stt, ext_end; + std::vector> nlist_a, nlist_r; + std::vector> nlist_a_cpy, nlist_r_cpy; + std::vector> ntype; + int f_ntypes = 1; + int ntypes = 2; // this information normally comes from natoms or avg/std + int nnei = sec_a.back(); + int ndescrpt = nnei * 4; + std::vector expected_env = { + 1.02167, -0.77271, 0.32370, 0.58475, 0.99745, 0.41810, 0.75655, -0.49773, 0.12206, 0.12047, 0.01502, -0.01263, 0.10564, 0.10495, -0.00143, 0.01198, 0.03103, 0.03041, 0.00452, -0.00425, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 1.02167, 0.77271, -0.32370, -0.58475, 0.59220, 0.42028, 0.16304, -0.38405, 0.04135, 0.04039, 0.00123, -0.00880, 0.03694, 0.03680, -0.00300, -0.00117, 0.00336, 0.00327, 0.00022, -0.00074, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.99745, -0.41810, -0.75655, 0.49773, 0.59220, -0.42028, -0.16304, 0.38405, 0.19078, 0.18961, -0.01951, 0.00793, 0.13499, 0.12636, -0.03140, 0.03566, 0.07054, 0.07049, -0.00175, -0.00210, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 1.06176, 0.16913, -0.55250, 0.89077, 1.03163, 0.96880, 0.23422, -0.26615, 0.19078, -0.18961, 0.01951, -0.00793, 0.12206, -0.12047, -0.01502, 0.01263, 0.04135, -0.04039, -0.00123, 0.00880, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 1.06176, -0.16913, 0.55250, -0.89077, 0.66798, 0.34516, 0.32245, -0.47232, 0.13499, -0.12636, 0.03140, -0.03566, 0.10564, -0.10495, 0.00143, -0.01198, 0.03694, -0.03680, 0.00300, 0.00117, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 1.03163, -0.96880, -0.23422, 0.26615, 0.66798, -0.34516, -0.32245, 0.47232, 0.07054, -0.07049, 0.00175, 0.00210, 0.03103, -0.03041, -0.00452, 0.00425, 0.00336, -0.00327, -0.00022, 0.00074, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + }; + std::vector expected_ntype = { + 1, 1, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 1, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 1, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 0, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + }; + std::vector expected_nmask = { + 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + }; + + void SetUp() override { + double box[] = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; + region.reinitBox(box); + copy_coord(posi_cpy, f_atype_cpy, mapping, ncell, ngcell, posi, f_atype, rc, region); + nloc = posi.size() / 3; + nall = posi_cpy.size() / 3; + nat_stt.resize(3); + ext_stt.resize(3); + ext_end.resize(3); + for (int dd = 0; dd < 3; ++dd){ + ext_stt[dd] = -ngcell[dd]; + ext_end[dd] = ncell[dd] + ngcell[dd]; + } + build_nlist(nlist_a, nlist_r, posi, rc, rc, ncell, region); + build_nlist(nlist_a_cpy, nlist_r_cpy, posi_cpy, nloc, rc, rc, nat_stt, ncell, ext_stt, ext_end, region, ncell); + } + void TearDown() override { + } +}; + + +class TestEnvMatAMixShortSel : public ::testing::Test +{ +protected: + std::vector posi = {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 f_atype = {0, 0, 0, 0, 0, 0}; + std::vector posi_cpy; +// std::vector atype_cpy; + std::vector f_atype_cpy; + int nloc, nall; + double rc = 6; + double rc_smth = 0.8; + SimulationRegion region; + std::vector mapping, ncell, ngcell; + std::vector sec_a = {0, 4}; + std::vector sec_r = {0, 0}; + std::vector nat_stt, ext_stt, ext_end; + std::vector> nlist_a, nlist_r; + std::vector> nlist_a_cpy, nlist_r_cpy; + std::vector> ntype; + int f_ntypes = 1; + int ntypes = 2; // this information normally comes from natoms or avg/std + int nnei = sec_a.back(); + int ndescrpt = nnei * 4; + std::vector expected_env = { + 1.02167, -0.77271, 0.32370, 0.58475, 0.99745, 0.41810, 0.75655, -0.49773, 0.12206, 0.12047, 0.01502, -0.01263, 0.10564, 0.10495, -0.00143, 0.01198, + 1.02167, 0.77271, -0.32370, -0.58475, 0.59220, 0.42028, 0.16304, -0.38405, 0.04135, 0.04039, 0.00123, -0.00880, 0.03694, 0.03680, -0.00300, -0.00117, + 0.99745, -0.41810, -0.75655, 0.49773, 0.59220, -0.42028, -0.16304, 0.38405, 0.19078, 0.18961, -0.01951, 0.00793, 0.13499, 0.12636, -0.03140, 0.03566, + 1.06176, 0.16913, -0.55250, 0.89077, 1.03163, 0.96880, 0.23422, -0.26615, 0.19078, -0.18961, 0.01951, -0.00793, 0.12206, -0.12047, -0.01502, 0.01263, + 1.06176, -0.16913, 0.55250, -0.89077, 0.66798, 0.34516, 0.32245, -0.47232, 0.13499, -0.12636, 0.03140, -0.03566, 0.10564, -0.10495, 0.00143, -0.01198, + 1.03163, -0.96880, -0.23422, 0.26615, 0.66798, -0.34516, -0.32245, 0.47232, 0.07054, -0.07049, 0.00175, 0.00210, 0.03103, -0.03041, -0.00452, 0.00425, + }; + std::vector expected_ntype = { + 1, 1, 0, 1, + 1, 1, 1, 0, + 0, 1, 0, 1, + 0, 1, 0, 1, + 0, 1, 1, 0, + 0, 1, 1, 0, + }; + std::vector expected_nmask = { + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1., + 1., 1., 1., 1., + }; + + void SetUp() override { + double box[] = {13., 0., 0., 0., 13., 0., 0., 0., 13.}; + region.reinitBox(box); + copy_coord(posi_cpy, f_atype_cpy, mapping, ncell, ngcell, posi, f_atype, rc, region); + nloc = posi.size() / 3; + nall = posi_cpy.size() / 3; + nat_stt.resize(3); + ext_stt.resize(3); + ext_end.resize(3); + for (int dd = 0; dd < 3; ++dd){ + ext_stt[dd] = -ngcell[dd]; + ext_end[dd] = ncell[dd] + ngcell[dd]; + } + build_nlist(nlist_a, nlist_r, posi, rc, rc, ncell, region); + build_nlist(nlist_a_cpy, nlist_r_cpy, posi_cpy, nloc, rc, rc, nat_stt, ncell, ext_stt, ext_end, region, ncell); + } + void TearDown() override { + } +}; + + +TEST_F(TestEnvMatAMix, orig_cpy) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_deriv, rij_a; + bool pbc = false; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_cpu(fmt_nlist_a, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret, -1); + env_mat_a(env, env_deriv, rij_a, posi_cpy, f_ntypes, f_atype_cpy, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + for (int jj = 0; jj < sec_a.back(); ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(env[jj*4+dd] - expected_env[ii*sec_a.back()*4 + jj*4 + dd]) , 1e-5); + } + } + // for (int jj = 0; jj < sec_a.back(); ++jj){ + // printf("%7.5f, %7.5f, %7.5f, %7.5f, ", env[jj*4+0], env[jj*4+1], env[jj*4+2], env[jj*4+3]); + // } + // printf("\n"); + } +} + +TEST_F(TestEnvMatAMix, orig_pbc) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_deriv, rij_a; + bool pbc = true; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_fill_a(fmt_nlist_a, fmt_nlist_r, posi, f_ntypes, f_atype, region, pbc, ii, nlist_a[ii], nlist_r[ii], rc, sec_a, sec_r); + EXPECT_EQ(ret, -1); + env_mat_a(env, env_deriv, rij_a, posi, f_ntypes, f_atype, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + for (int jj = 0; jj < sec_a.back(); ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(env[jj*4+dd] - expected_env[ii*sec_a.back()*4 + jj*4 + dd]) , 1e-5); + } + } + } +} + +TEST_F(TestEnvMatAMix, orig_cpy_equal_pbc) +{ + std::vector fmt_nlist_a_0, fmt_nlist_r_0; + std::vector fmt_nlist_a_1, fmt_nlist_r_1; + std::vector env_0, env_deriv_0, rij_a_0; + std::vector env_1, env_deriv_1, rij_a_1; + for(int ii = 0; ii < nloc; ++ii){ + int ret_0 = format_nlist_i_cpu(fmt_nlist_a_0, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret_0, -1); + env_mat_a(env_0, env_deriv_0, rij_a_0, posi_cpy, f_ntypes, f_atype_cpy, region, false, ii, fmt_nlist_a_0, sec_a, rc_smth, rc); + int ret_1 = format_nlist_i_fill_a(fmt_nlist_a_1, fmt_nlist_r_1, posi, f_ntypes, f_atype, region, true, ii, nlist_a[ii], nlist_r[ii], rc, sec_a, sec_r); + EXPECT_EQ(ret_1, -1); + env_mat_a(env_1, env_deriv_1, rij_a_1, posi, f_ntypes, f_atype, region, true, ii, fmt_nlist_a_1, sec_a, rc_smth, rc); + EXPECT_EQ(env_0.size(), env_1.size()); + EXPECT_EQ(env_deriv_0.size(), env_deriv_1.size()); + EXPECT_EQ(rij_a_0.size(), rij_a_1.size()); + for (unsigned jj = 0; jj < env_0.size(); ++jj){ + EXPECT_LT(fabs(env_0[jj] - env_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < env_deriv_0.size(); ++jj){ + EXPECT_LT(fabs(env_deriv_0[jj] - env_deriv_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < rij_a_0.size(); ++jj){ + EXPECT_LT(fabs(rij_a_0[jj] - rij_a_1[jj]), 1e-10); + } + } +} + +TEST_F(TestEnvMatAMix, orig_cpy_num_deriv) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_0, env_1, env_deriv, env_deriv_tmp, rij_a; + bool pbc = false; + double hh = 1e-5; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_cpu(fmt_nlist_a, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret, -1); + env_mat_a(env, env_deriv, rij_a, posi_cpy, f_ntypes, f_atype_cpy, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + + for (int jj = 0; jj < sec_a.back(); ++jj){ + int j_idx = fmt_nlist_a[jj]; + if (j_idx < 0) continue; + for (int kk = 0; kk < 4; ++kk){ + for (int dd = 0; dd < 3; ++dd){ + std::vector posi_0 = posi_cpy; + std::vector posi_1 = posi_cpy; + posi_0[j_idx*3+dd] -= hh; + posi_1[j_idx*3+dd] += hh; + env_mat_a(env_0, env_deriv_tmp, rij_a, posi_0, f_ntypes, f_atype_cpy, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + env_mat_a(env_1, env_deriv_tmp, rij_a, posi_1, f_ntypes, f_atype_cpy, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + double num_deriv = (env_1[jj*4+kk] - env_0[jj*4+kk])/(2.*hh); + double ana_deriv = -env_deriv[jj*12+kk*3+dd]; + EXPECT_LT(fabs(num_deriv - ana_deriv), 1e-5); + } + } + } + // for (int jj = 0; jj < sec_a.back(); ++jj){ + // printf("%7.5f, %7.5f, %7.5f, %7.5f, ", env[jj*4+0], env[jj*4+1], env[jj*4+2], env[jj*4+3]); + // } + // printf("\n"); + } +} + +TEST_F(TestEnvMatAMix, cpu) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_deriv, rij_a; + bool pbc = false; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_cpu(fmt_nlist_a, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret, -1); + deepmd::env_mat_a_cpu(env, env_deriv, rij_a, posi_cpy, f_atype_cpy, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + for (int jj = 0; jj < sec_a.back(); ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(env[jj*4+dd] - expected_env[ii*sec_a.back()*4 + jj*4 + dd]) , 1e-5); + } + } + } +} + +TEST_F(TestEnvMatAMix, cpu_equal_orig_cpy) +{ + std::vector fmt_nlist_a_0, fmt_nlist_r_0; + std::vector fmt_nlist_a_1, fmt_nlist_r_1; + std::vector env_0, env_deriv_0, rij_a_0; + std::vector env_1, env_deriv_1, rij_a_1; + for(int ii = 0; ii < nloc; ++ii){ + int ret_0 = format_nlist_i_cpu(fmt_nlist_a_0, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret_0, -1); + env_mat_a(env_0, env_deriv_0, rij_a_0, posi_cpy, f_ntypes, f_atype_cpy, region, false, ii, fmt_nlist_a_0, sec_a, rc_smth, rc); + + int ret_1 = format_nlist_i_cpu(fmt_nlist_a_1, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + + EXPECT_EQ(ret_1, -1); + deepmd::env_mat_a_cpu(env_1, env_deriv_1, rij_a_1, posi_cpy, f_atype_cpy, ii, fmt_nlist_a_1, sec_a, rc_smth, rc); + + EXPECT_EQ(env_0.size(), env_1.size()); + EXPECT_EQ(env_deriv_0.size(), env_deriv_1.size()); + EXPECT_EQ(rij_a_0.size(), rij_a_1.size()); + for (unsigned jj = 0; jj < env_0.size(); ++jj){ + EXPECT_LT(fabs(env_0[jj] - env_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < env_deriv_0.size(); ++jj){ + EXPECT_LT(fabs(env_deriv_0[jj] - env_deriv_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < rij_a_0.size(); ++jj){ + EXPECT_LT(fabs(rij_a_0[jj] - rij_a_1[jj]), 1e-10); + } + } +} + +TEST_F(TestEnvMatAMix, cpu_num_deriv) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_0, env_1, env_deriv, env_deriv_tmp, rij_a; + bool pbc = false; + double hh = 1e-5; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_cpu(fmt_nlist_a, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret, -1); + deepmd::env_mat_a_cpu(env, env_deriv, rij_a, posi_cpy, f_atype_cpy, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + + for (int jj = 0; jj < sec_a.back(); ++jj){ + int j_idx = fmt_nlist_a[jj]; + if (j_idx < 0) continue; + for (int kk = 0; kk < 4; ++kk){ + for (int dd = 0; dd < 3; ++dd){ + std::vector posi_0 = posi_cpy; + std::vector posi_1 = posi_cpy; + posi_0[j_idx*3+dd] -= hh; + posi_1[j_idx*3+dd] += hh; + env_mat_a(env_0, env_deriv_tmp, rij_a, posi_0, f_ntypes, f_atype_cpy, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + env_mat_a(env_1, env_deriv_tmp, rij_a, posi_1, f_ntypes, f_atype_cpy, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + double num_deriv = (env_1[jj*4+kk] - env_0[jj*4+kk])/(2.*hh); + double ana_deriv = -env_deriv[jj*12+kk*3+dd]; + EXPECT_LT(fabs(num_deriv - ana_deriv), 1e-5); + } + } + } + // for (int jj = 0; jj < sec_a.back(); ++jj){ + // printf("%7.5f, %7.5f, %7.5f, %7.5f, ", env[jj*4+0], env[jj*4+1], env[jj*4+2], env[jj*4+3]); + // } + // printf("\n"); + } +} + +TEST_F(TestEnvMatAMixShortSel, orig_cpy) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_deriv, rij_a; + bool pbc = false; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_cpu(fmt_nlist_a, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret, 0); + env_mat_a(env, env_deriv, rij_a, posi_cpy, f_ntypes, f_atype_cpy, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + for (int jj = 0; jj < sec_a.back(); ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(env[jj*4+dd] - expected_env[ii*sec_a.back()*4 + jj*4 + dd]) , 1e-5); + } + } + // for (int jj = 0; jj < sec_a.back(); ++jj){ + // printf("%8.5f, %8.5f, %8.5f, %8.5f, ", env[jj*4+0], env[jj*4+1], env[jj*4+2], env[jj*4+3]); + // } + // printf("\n"); + } +} + +TEST_F(TestEnvMatAMixShortSel, orig_pbc) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_deriv, rij_a; + bool pbc = true; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_fill_a(fmt_nlist_a, fmt_nlist_r, posi, f_ntypes, f_atype, region, pbc, ii, nlist_a[ii], nlist_r[ii], rc, sec_a, sec_r); + EXPECT_EQ(ret, 0); + env_mat_a(env, env_deriv, rij_a, posi, f_ntypes, f_atype, region, pbc, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + for (int jj = 0; jj < sec_a.back(); ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(env[jj*4+dd] - expected_env[ii*sec_a.back()*4 + jj*4 + dd]) , 1e-5); + } + } + } +} + +TEST_F(TestEnvMatAMixShortSel, cpu) +{ + std::vector fmt_nlist_a, fmt_nlist_r; + std::vector env, env_deriv, rij_a; + bool pbc = false; + for(int ii = 0; ii < nloc; ++ii){ + int ret = format_nlist_i_cpu(fmt_nlist_a, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret, 0); + deepmd::env_mat_a_cpu(env, env_deriv, rij_a, posi_cpy, f_atype_cpy, ii, fmt_nlist_a, sec_a, rc_smth, rc); + EXPECT_EQ(env.size(), sec_a.back()*4); + EXPECT_EQ(env.size(), env_deriv.size()/3); + EXPECT_EQ(rij_a.size(), sec_a.back()*3); + for (int jj = 0; jj < sec_a.back(); ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(env[jj*4+dd] - expected_env[ii*sec_a.back()*4 + jj*4 + dd]) , 1e-5); + } + } + } +} + +TEST_F(TestEnvMatAMix, prod_cpu) +{ + EXPECT_EQ(nlist_r_cpy.size(), nloc); + int tot_nnei = 0; + int max_nbor_size = 0; + for(int ii = 0; ii < nlist_a_cpy.size(); ++ii){ + tot_nnei += nlist_a_cpy[ii].size(); + if (nlist_a_cpy[ii].size() > max_nbor_size){ + max_nbor_size = nlist_a_cpy[ii].size(); + } + } + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + deepmd::convert_nlist(inlist, nlist_a_cpy); + + std::vector em(nloc * ndescrpt), em_deriv(nloc * ndescrpt * 3), rij(nloc * nnei * 3); + std::vector nlist(nloc * nnei); + std::vector ntype(nloc * nnei); + std::vector nmask(nloc * nnei); + std::vector avg(ntypes * ndescrpt, 0); + std::vector std(ntypes * ndescrpt, 1); + deepmd::prod_env_mat_a_mix_cpu( + &em[0], + &em_deriv[0], + &rij[0], + &nlist[0], + &posi_cpy[0], + &f_atype_cpy[0], + &atype[0], + inlist, + max_nbor_size, + &avg[0], + &std[0], + nloc, + nall, + rc, + rc_smth, + sec_a); + deepmd::use_nei_info_cpu( + &nlist[0], + &ntype[0], + &nmask[0], + &atype[0], + &mapping[0], + nloc, + nnei, + ntypes, + true); + + for(int ii = 0; ii < nloc; ++ii){ + for (int jj = 0; jj < nnei; ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(em[ii*nnei*4 + jj*4 + dd] - + expected_env[ii*nnei*4 + jj*4 + dd]) , + 1e-5); + } + EXPECT_EQ(ntype[ii*nnei+jj], expected_ntype[ii*nnei+jj]); + EXPECT_LT(fabs(nmask[ii*nnei+jj] - expected_nmask[ii*nnei+jj]), 1e-5); + } + } +} + +TEST_F(TestEnvMatAMix, prod_cpu_equal_cpu) +{ + EXPECT_EQ(nlist_r_cpy.size(), nloc); + int tot_nnei = 0; + int max_nbor_size = 0; + for(int ii = 0; ii < nlist_a_cpy.size(); ++ii){ + tot_nnei += nlist_a_cpy[ii].size(); + if (nlist_a_cpy[ii].size() > max_nbor_size){ + max_nbor_size = nlist_a_cpy[ii].size(); + } + } + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]); + convert_nlist(inlist, nlist_a_cpy); + std::vector em(nloc * ndescrpt), em_deriv(nloc * ndescrpt * 3), rij(nloc * nnei * 3); + std::vector nlist(nloc * nnei); + std::vector avg(ntypes * ndescrpt, 0); + std::vector std(ntypes * ndescrpt, 1); + deepmd::prod_env_mat_a_mix_cpu( + &em[0], + &em_deriv[0], + &rij[0], + &nlist[0], + &posi_cpy[0], + &f_atype_cpy[0], + &atype[0], + inlist, + max_nbor_size, + &avg[0], + &std[0], + nloc, + nall, + rc, + rc_smth, + sec_a); + + std::vector fmt_nlist_a_1, fmt_nlist_r_1; + std::vector env_1, env_deriv_1, rij_a_1; + for(int ii = 0; ii < nloc; ++ii){ + int ret_1 = format_nlist_i_cpu(fmt_nlist_a_1, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret_1, -1); + deepmd::env_mat_a_cpu(env_1, env_deriv_1, rij_a_1, posi_cpy, f_atype_cpy, ii, fmt_nlist_a_1, sec_a, rc_smth, rc); + EXPECT_EQ(env_1.size(), nnei * 4); + EXPECT_EQ(env_deriv_1.size(), nnei * 4 * 3); + EXPECT_EQ(rij_a_1.size(), nnei * 3); + EXPECT_EQ(fmt_nlist_a_1.size(), nnei); + EXPECT_EQ(env_1.size() * nloc, em.size()); + EXPECT_EQ(env_deriv_1.size() * nloc, em_deriv.size()); + EXPECT_EQ(rij_a_1.size() * nloc, rij.size()); + EXPECT_EQ(fmt_nlist_a_1.size() * nloc, nlist.size()); + for (unsigned jj = 0; jj < env_1.size(); ++jj){ + EXPECT_LT(fabs(em[ii*nnei*4+jj] - env_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < env_deriv_1.size(); ++jj){ + EXPECT_LT(fabs(em_deriv[ii*nnei*4*3+jj] - env_deriv_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < rij_a_1.size(); ++jj){ + EXPECT_LT(fabs(rij[ii*nnei*3+jj] - rij_a_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < fmt_nlist_a_1.size(); ++jj){ + EXPECT_EQ(nlist[ii*nnei+jj], fmt_nlist_a_1[jj]); + } + } + + // for(int ii = 0; ii < nloc; ++ii){ + // for (int jj = 0; jj < nnei; ++jj){ + // for (int dd = 0; dd < 4; ++dd){ + // EXPECT_LT(fabs(em[ii*nnei*4 + jj*4 + dd] - + // expected_env[ii*nnei*4 + jj*4 + dd]) , + // 1e-5); + // } + // } + // } +} + + +#if GOOGLE_CUDA +TEST_F(TestEnvMatAMix, prod_gpu_cuda) +{ + EXPECT_EQ(nlist_r_cpy.size(), nloc); + int tot_nnei = 0; + int max_nbor_size = 0; + for(int ii = 0; ii < nlist_a_cpy.size(); ++ii){ + tot_nnei += nlist_a_cpy[ii].size(); + if (nlist_a_cpy[ii].size() > max_nbor_size){ + max_nbor_size = nlist_a_cpy[ii].size(); + } + } + assert(max_nbor_size <= GPU_MAX_NBOR_SIZE); + if (max_nbor_size <= 1024) { + max_nbor_size = 1024; + } + else if (max_nbor_size <= 2048) { + max_nbor_size = 2048; + } + else { + max_nbor_size = 4096; + } + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]), gpu_inlist; + convert_nlist(inlist, nlist_a_cpy); + std::vector em(nloc * ndescrpt, 0.0), em_deriv(nloc * ndescrpt * 3, 0.0), rij(nloc * nnei * 3, 0.0); + std::vector nlist(nloc * nnei, 0); + std::vector ntype(nloc * nnei, 0); + std::vector nmask(nloc * nnei, 0.); + std::vector avg(ntypes * ndescrpt, 0); + std::vector std(ntypes * ndescrpt, 1); + + double * em_dev = NULL, * em_deriv_dev = NULL, * rij_dev = NULL, * nmask_dev = NULL; + double * posi_cpy_dev = NULL, * avg_dev = NULL, * std_dev = NULL; + int * f_atype_cpy_dev = NULL, * atype_dev = NULL, * nlist_dev = NULL, * ntype_dev = NULL, * mapping_dev = NULL, * array_int_dev = NULL, * memory_dev = NULL; + uint_64 * array_longlong_dev = NULL; + deepmd::malloc_device_memory_sync(em_dev, em); + deepmd::malloc_device_memory_sync(em_deriv_dev, em_deriv); + deepmd::malloc_device_memory_sync(rij_dev, rij); + deepmd::malloc_device_memory_sync(posi_cpy_dev, posi_cpy); + deepmd::malloc_device_memory_sync(avg_dev, avg); + deepmd::malloc_device_memory_sync(std_dev, std); + deepmd::malloc_device_memory_sync(f_atype_cpy_dev, f_atype_cpy); + deepmd::malloc_device_memory_sync(atype_dev, atype); + deepmd::malloc_device_memory_sync(nlist_dev, nlist); + deepmd::malloc_device_memory_sync(ntype_dev, ntype); + deepmd::malloc_device_memory_sync(mapping_dev, mapping); + deepmd::malloc_device_memory_sync(nmask_dev, nmask); + deepmd::malloc_device_memory(array_int_dev, sec_a.size() + nloc * sec_a.size() + nloc); + deepmd::malloc_device_memory(array_longlong_dev, nloc * GPU_MAX_NBOR_SIZE * 2); + deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); + deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); + + deepmd::prod_env_mat_a_mix_gpu_cuda( + em_dev, + em_deriv_dev, + rij_dev, + nlist_dev, + posi_cpy_dev, + f_atype_cpy_dev, + atype_dev, + gpu_inlist, + array_int_dev, + array_longlong_dev, + max_nbor_size, + avg_dev, + std_dev, + nloc, + nall, + rc, + rc_smth, + sec_a); + + deepmd::use_nei_info_gpu( + nlist_dev, + ntype_dev, + nmask_dev, + atype_dev, + mapping_dev, + nloc, + nnei, + ntypes, + true); + deepmd::memcpy_device_to_host(em_dev, em); + deepmd::memcpy_device_to_host(ntype_dev, ntype); + deepmd::memcpy_device_to_host(nmask_dev, nmask); + deepmd::delete_device_memory(em_dev); + deepmd::delete_device_memory(em_deriv_dev); + deepmd::delete_device_memory(rij_dev); + deepmd::delete_device_memory(nlist_dev); + deepmd::delete_device_memory(ntype_dev); + deepmd::delete_device_memory(nmask_dev); + deepmd::delete_device_memory(posi_cpy_dev); + deepmd::delete_device_memory(f_atype_cpy_dev); + deepmd::delete_device_memory(atype_dev); + deepmd::delete_device_memory(mapping_dev); + deepmd::delete_device_memory(array_int_dev); + deepmd::delete_device_memory(array_longlong_dev); + deepmd::delete_device_memory(avg_dev); + deepmd::delete_device_memory(std_dev); + deepmd::delete_device_memory(memory_dev); + deepmd::free_nlist_gpu_device(gpu_inlist); + + for(int ii = 0; ii < nloc; ++ii){ + for (int jj = 0; jj < nnei; ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(em[ii*nnei*4 + jj*4 + dd] - + expected_env[ii*nnei*4 + jj*4 + dd]) , + 1e-5); + } + EXPECT_EQ(ntype[ii*nnei+jj], expected_ntype[ii*nnei+jj]); + EXPECT_LT(fabs(nmask[ii*nnei+jj] - expected_nmask[ii*nnei+jj]), 1e-5); + } + } +} + + +TEST_F(TestEnvMatAMix, prod_gpu_cuda_equal_cpu) +{ + EXPECT_EQ(nlist_r_cpy.size(), nloc); + int tot_nnei = 0; + int max_nbor_size = 0; + for(int ii = 0; ii < nlist_a_cpy.size(); ++ii){ + tot_nnei += nlist_a_cpy[ii].size(); + if (nlist_a_cpy[ii].size() > max_nbor_size){ + max_nbor_size = nlist_a_cpy[ii].size(); + } + } + assert(max_nbor_size <= GPU_MAX_NBOR_SIZE); + if (max_nbor_size <= 1024) { + max_nbor_size = 1024; + } + else if (max_nbor_size <= 2048) { + max_nbor_size = 2048; + } + else { + max_nbor_size = 4096; + } + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]), gpu_inlist; + convert_nlist(inlist, nlist_a_cpy); + std::vector em(nloc * ndescrpt, 0.0), em_deriv(nloc * ndescrpt * 3, 0.0), rij(nloc * nnei * 3, 0.0); + std::vector nlist(nloc * nnei, 0); + std::vector avg(ntypes * ndescrpt, 0); + std::vector std(ntypes * ndescrpt, 1); + + double * em_dev = NULL, * em_deriv_dev = NULL, * rij_dev = NULL; + double * posi_cpy_dev = NULL, * avg_dev = NULL, * std_dev = NULL; + int * f_atype_cpy_dev = NULL, * atype_dev = NULL, * nlist_dev = NULL, * array_int_dev = NULL, * memory_dev = NULL; + uint_64 * array_longlong_dev = NULL; + deepmd::malloc_device_memory_sync(em_dev, em); + deepmd::malloc_device_memory_sync(em_deriv_dev, em_deriv); + deepmd::malloc_device_memory_sync(rij_dev, rij); + deepmd::malloc_device_memory_sync(posi_cpy_dev, posi_cpy); + deepmd::malloc_device_memory_sync(avg_dev, avg); + deepmd::malloc_device_memory_sync(std_dev, std); + + deepmd::malloc_device_memory_sync(f_atype_cpy_dev, f_atype_cpy); + deepmd::malloc_device_memory_sync(atype_dev, atype); + deepmd::malloc_device_memory_sync(nlist_dev, nlist); + deepmd::malloc_device_memory(array_int_dev, sec_a.size() + nloc * sec_a.size() + nloc); + deepmd::malloc_device_memory(array_longlong_dev, nloc * GPU_MAX_NBOR_SIZE * 2); + deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); + deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); + + deepmd::prod_env_mat_a_mix_gpu_cuda( + em_dev, + em_deriv_dev, + rij_dev, + nlist_dev, + posi_cpy_dev, + f_atype_cpy_dev, + atype_dev, + gpu_inlist, + array_int_dev, + array_longlong_dev, + max_nbor_size, + avg_dev, + std_dev, + nloc, + nall, + rc, + rc_smth, + sec_a); + deepmd::memcpy_device_to_host(em_dev, em); + deepmd::memcpy_device_to_host(em_deriv_dev, em_deriv); + deepmd::memcpy_device_to_host(rij_dev, rij); + deepmd::memcpy_device_to_host(nlist_dev, nlist); + deepmd::delete_device_memory(em_dev); + deepmd::delete_device_memory(em_deriv_dev); + deepmd::delete_device_memory(nlist_dev); + deepmd::delete_device_memory(posi_cpy_dev); + deepmd::delete_device_memory(f_atype_cpy_dev); + deepmd::delete_device_memory(atype_dev); + deepmd::delete_device_memory(array_int_dev); + deepmd::delete_device_memory(array_longlong_dev); + deepmd::delete_device_memory(avg_dev); + deepmd::delete_device_memory(std_dev); + deepmd::delete_device_memory(memory_dev); + deepmd::free_nlist_gpu_device(gpu_inlist); + + std::vector fmt_nlist_a_1, fmt_nlist_r_1; + std::vector env_1, env_deriv_1, rij_a_1; + for(int ii = 0; ii < nloc; ++ii){ + int ret_1 = format_nlist_i_cpu(fmt_nlist_a_1, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret_1, -1); + deepmd::env_mat_a_cpu(env_1, env_deriv_1, rij_a_1, posi_cpy, f_atype_cpy, ii, fmt_nlist_a_1, sec_a, rc_smth, rc); + EXPECT_EQ(env_1.size(), nnei * 4); + EXPECT_EQ(env_deriv_1.size(), nnei * 4 * 3); + EXPECT_EQ(rij_a_1.size(), nnei * 3); + EXPECT_EQ(fmt_nlist_a_1.size(), nnei); + EXPECT_EQ(env_1.size() * nloc, em.size()); + EXPECT_EQ(env_deriv_1.size() * nloc, em_deriv.size()); + EXPECT_EQ(rij_a_1.size() * nloc, rij.size()); + EXPECT_EQ(fmt_nlist_a_1.size() * nloc, nlist.size()); + for (unsigned jj = 0; jj < env_1.size(); ++jj){ + EXPECT_LT(fabs(em[ii*nnei*4+jj] - env_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < env_deriv_1.size(); ++jj){ + EXPECT_LT(fabs(em_deriv[ii*nnei*4*3+jj] - env_deriv_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < rij_a_1.size(); ++jj){ + EXPECT_LT(fabs(rij[ii*nnei*3+jj] - rij_a_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < fmt_nlist_a_1.size(); ++jj){ + EXPECT_EQ(nlist[ii*nnei+jj], fmt_nlist_a_1[jj]); + } + } + + for(int ii = 0; ii < nloc; ++ii){ + for (int jj = 0; jj < nnei; ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(em[ii*nnei*4 + jj*4 + dd] - + expected_env[ii*nnei*4 + jj*4 + dd]) , + 1e-5); + } + } + } +} +#endif //GOOGLE_CUDA + +#if TENSORFLOW_USE_ROCM +TEST_F(TestEnvMatAMix, prod_gpu_rocm) +{ + EXPECT_EQ(nlist_r_cpy.size(), nloc); + int tot_nnei = 0; + int max_nbor_size = 0; + for(int ii = 0; ii < nlist_a_cpy.size(); ++ii){ + tot_nnei += nlist_a_cpy[ii].size(); + if (nlist_a_cpy[ii].size() > max_nbor_size){ + max_nbor_size = nlist_a_cpy[ii].size(); + } + } + assert(max_nbor_size <= GPU_MAX_NBOR_SIZE); + if (max_nbor_size <= 1024) { + max_nbor_size = 1024; + } + else if (max_nbor_size <= 2048) { + max_nbor_size = 2048; + } + else { + max_nbor_size = 4096; + } + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]), gpu_inlist; + convert_nlist(inlist, nlist_a_cpy); + std::vector em(nloc * ndescrpt, 0.0), em_deriv(nloc * ndescrpt * 3, 0.0), rij(nloc * nnei * 3, 0.0); + std::vector nlist(nloc * nnei, 0); + std::vector ntype(nloc * nnei, 0); + std::vector nmask(nloc * nnei, 0.); + std::vector avg(ntypes * ndescrpt, 0); + std::vector std(ntypes * ndescrpt, 1); + + double * em_dev = NULL, * em_deriv_dev = NULL, * rij_dev = NULL, * nmask_dev = NULL; + double * posi_cpy_dev = NULL, * avg_dev = NULL, * std_dev = NULL; + int * f_atype_cpy_dev = NULL, * atype_dev = NULL, * nlist_dev = NULL, * ntype_dev = NULL, * mapping_dev = NULL, * array_int_dev = NULL, * memory_dev = NULL; + uint_64 * array_longlong_dev = NULL; + deepmd::malloc_device_memory_sync(em_dev, em); + deepmd::malloc_device_memory_sync(em_deriv_dev, em_deriv); + deepmd::malloc_device_memory_sync(rij_dev, rij); + deepmd::malloc_device_memory_sync(posi_cpy_dev, posi_cpy); + deepmd::malloc_device_memory_sync(avg_dev, avg); + deepmd::malloc_device_memory_sync(std_dev, std); + deepmd::malloc_device_memory_sync(f_atype_cpy_dev, f_atype_cpy); + deepmd::malloc_device_memory_sync(atype_dev, atype); + deepmd::malloc_device_memory_sync(nlist_dev, nlist); + deepmd::malloc_device_memory_sync(ntype_dev, ntype); + deepmd::malloc_device_memory_sync(mapping_dev, mapping); + deepmd::malloc_device_memory_sync(nmask_dev, nmask); + deepmd::malloc_device_memory(array_int_dev, sec_a.size() + nloc * sec_a.size() + nloc); + deepmd::malloc_device_memory(array_longlong_dev, nloc * GPU_MAX_NBOR_SIZE * 2); + deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); + deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); + + deepmd::prod_env_mat_a_mix_gpu_rocm( + em_dev, + em_deriv_dev, + rij_dev, + nlist_dev, + posi_cpy_dev, + f_atype_cpy_dev, + atype_dev, + gpu_inlist, + array_int_dev, + array_longlong_dev, + max_nbor_size, + avg_dev, + std_dev, + nloc, + nall, + rc, + rc_smth, + sec_a); + + deepmd::use_nei_info_gpu_rocm( + nlist_dev, + ntype_dev, + nmask_dev, + atype_dev, + mapping_dev, + nloc, + nnei, + ntypes, + true); + deepmd::memcpy_device_to_host(em_dev, em); + deepmd::memcpy_device_to_host(ntype_dev, ntype); + deepmd::memcpy_device_to_host(nmask_dev, nmask); + deepmd::delete_device_memory(em_dev); + deepmd::delete_device_memory(em_deriv_dev); + deepmd::delete_device_memory(rij_dev); + deepmd::delete_device_memory(nlist_dev); + deepmd::delete_device_memory(ntype_dev); + deepmd::delete_device_memory(nmask_dev); + deepmd::delete_device_memory(posi_cpy_dev); + deepmd::delete_device_memory(f_atype_cpy_dev); + deepmd::delete_device_memory(atype_dev); + deepmd::delete_device_memory(mapping_dev); + deepmd::delete_device_memory(array_int_dev); + deepmd::delete_device_memory(array_longlong_dev); + deepmd::delete_device_memory(avg_dev); + deepmd::delete_device_memory(std_dev); + deepmd::delete_device_memory(memory_dev); + deepmd::free_nlist_gpu_device(gpu_inlist); + + for(int ii = 0; ii < nloc; ++ii){ + for (int jj = 0; jj < nnei; ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(em[ii*nnei*4 + jj*4 + dd] - + expected_env[ii*nnei*4 + jj*4 + dd]) , + 1e-5); + } + EXPECT_EQ(ntype[ii*nnei+jj], expected_ntype[ii*nnei+jj]); + EXPECT_LT(fabs(nmask[ii*nnei+jj] - expected_nmask[ii*nnei+jj]), 1e-5); + } + } +} + + +TEST_F(TestEnvMatAMix, prod_gpu_rocm_equal_cpu) +{ + EXPECT_EQ(nlist_r_cpy.size(), nloc); + int tot_nnei = 0; + int max_nbor_size = 0; + for(int ii = 0; ii < nlist_a_cpy.size(); ++ii){ + tot_nnei += nlist_a_cpy[ii].size(); + if (nlist_a_cpy[ii].size() > max_nbor_size){ + max_nbor_size = nlist_a_cpy[ii].size(); + } + } + assert(max_nbor_size <= GPU_MAX_NBOR_SIZE); + if (max_nbor_size <= 1024) { + max_nbor_size = 1024; + } + else if (max_nbor_size <= 2048) { + max_nbor_size = 2048; + } + else { + max_nbor_size = 4096; + } + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + deepmd::InputNlist inlist(nloc, &ilist[0], &numneigh[0], &firstneigh[0]), gpu_inlist; + convert_nlist(inlist, nlist_a_cpy); + std::vector em(nloc * ndescrpt, 0.0), em_deriv(nloc * ndescrpt * 3, 0.0), rij(nloc * nnei * 3, 0.0); + std::vector nlist(nloc * nnei, 0); + std::vector avg(ntypes * ndescrpt, 0); + std::vector std(ntypes * ndescrpt, 1); + + double * em_dev = NULL, * em_deriv_dev = NULL, * rij_dev = NULL; + double * posi_cpy_dev = NULL, * avg_dev = NULL, * std_dev = NULL; + int * f_atype_cpy_dev = NULL, * atype_dev = NULL, * nlist_dev = NULL, * array_int_dev = NULL, * memory_dev = NULL; + uint_64 * array_longlong_dev = NULL; + deepmd::malloc_device_memory_sync(em_dev, em); + deepmd::malloc_device_memory_sync(em_deriv_dev, em_deriv); + deepmd::malloc_device_memory_sync(rij_dev, rij); + deepmd::malloc_device_memory_sync(posi_cpy_dev, posi_cpy); + deepmd::malloc_device_memory_sync(avg_dev, avg); + deepmd::malloc_device_memory_sync(std_dev, std); + + deepmd::malloc_device_memory_sync(f_atype_cpy_dev, f_atype_cpy); + deepmd::malloc_device_memory_sync(atype_dev, atype); + deepmd::malloc_device_memory_sync(nlist_dev, nlist); + deepmd::malloc_device_memory(array_int_dev, sec_a.size() + nloc * sec_a.size() + nloc); + deepmd::malloc_device_memory(array_longlong_dev, nloc * GPU_MAX_NBOR_SIZE * 2); + deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); + deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); + + deepmd::prod_env_mat_a_mix_gpu_rocm( + em_dev, + em_deriv_dev, + rij_dev, + nlist_dev, + posi_cpy_dev, + f_atype_cpy_dev, + atype_dev, + gpu_inlist, + array_int_dev, + array_longlong_dev, + max_nbor_size, + avg_dev, + std_dev, + nloc, + nall, + rc, + rc_smth, + sec_a); + deepmd::memcpy_device_to_host(em_dev, em); + deepmd::memcpy_device_to_host(em_deriv_dev, em_deriv); + deepmd::memcpy_device_to_host(rij_dev, rij); + deepmd::memcpy_device_to_host(nlist_dev, nlist); + deepmd::delete_device_memory(em_dev); + deepmd::delete_device_memory(em_deriv_dev); + deepmd::delete_device_memory(nlist_dev); + deepmd::delete_device_memory(posi_cpy_dev); + deepmd::delete_device_memory(f_atype_cpy_dev); + deepmd::delete_device_memory(atype_dev); + deepmd::delete_device_memory(array_int_dev); + deepmd::delete_device_memory(array_longlong_dev); + deepmd::delete_device_memory(avg_dev); + deepmd::delete_device_memory(std_dev); + deepmd::delete_device_memory(memory_dev); + deepmd::free_nlist_gpu_device(gpu_inlist); + + std::vector fmt_nlist_a_1, fmt_nlist_r_1; + std::vector env_1, env_deriv_1, rij_a_1; + for(int ii = 0; ii < nloc; ++ii){ + int ret_1 = format_nlist_i_cpu(fmt_nlist_a_1, posi_cpy, f_atype_cpy, ii, nlist_a_cpy[ii], rc, sec_a); + EXPECT_EQ(ret_1, -1); + deepmd::env_mat_a_cpu(env_1, env_deriv_1, rij_a_1, posi_cpy, f_atype_cpy, ii, fmt_nlist_a_1, sec_a, rc_smth, rc); + EXPECT_EQ(env_1.size(), nnei * 4); + EXPECT_EQ(env_deriv_1.size(), nnei * 4 * 3); + EXPECT_EQ(rij_a_1.size(), nnei * 3); + EXPECT_EQ(fmt_nlist_a_1.size(), nnei); + EXPECT_EQ(env_1.size() * nloc, em.size()); + EXPECT_EQ(env_deriv_1.size() * nloc, em_deriv.size()); + EXPECT_EQ(rij_a_1.size() * nloc, rij.size()); + EXPECT_EQ(fmt_nlist_a_1.size() * nloc, nlist.size()); + for (unsigned jj = 0; jj < env_1.size(); ++jj){ + EXPECT_LT(fabs(em[ii*nnei*4+jj] - env_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < env_deriv_1.size(); ++jj){ + EXPECT_LT(fabs(em_deriv[ii*nnei*4*3+jj] - env_deriv_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < rij_a_1.size(); ++jj){ + EXPECT_LT(fabs(rij[ii*nnei*3+jj] - rij_a_1[jj]), 1e-10); + } + for (unsigned jj = 0; jj < fmt_nlist_a_1.size(); ++jj){ + EXPECT_EQ(nlist[ii*nnei+jj], fmt_nlist_a_1[jj]); + } + } + + for(int ii = 0; ii < nloc; ++ii){ + for (int jj = 0; jj < nnei; ++jj){ + for (int dd = 0; dd < 4; ++dd){ + EXPECT_LT(fabs(em[ii*nnei*4 + jj*4 + dd] - + expected_env[ii*nnei*4 + jj*4 + dd]) , + 1e-5); + } + } + } +} +#endif //TENSORFLOW_USE_ROCM diff --git a/source/op/prod_env_mat_multi_device.cc b/source/op/prod_env_mat_multi_device.cc index f88606053d..22f2ba6ad3 100644 --- a/source/op/prod_env_mat_multi_device.cc +++ b/source/op/prod_env_mat_multi_device.cc @@ -147,6 +147,27 @@ REGISTER_OP("DescrptSeR") .Output("rij: T") .Output("nlist: int32"); +REGISTER_OP("ProdEnvMatAMix") + .Attr("T: {float, double} = DT_DOUBLE") + .Input("coord: T") //atomic coordinates + .Input("type: int32") //atomic type + .Input("natoms: int32") //local atomic number; each type atomic number + .Input("box : T") + .Input("mesh : int32") + .Input("davg: T") //average value of data + .Input("dstd: T") //standard deviation + .Attr("rcut_a: float") //no use + .Attr("rcut_r: float") + .Attr("rcut_r_smth: float") + .Attr("sel_a: list(int)") + .Attr("sel_r: list(int)") //all zero + .Output("descrpt: T") + .Output("descrpt_deriv: T") + .Output("rij: T") + .Output("nlist: int32") + .Output("ntype: int32") + .Output("nmask: T");; + template static int _norm_copy_coord_cpu( @@ -184,6 +205,19 @@ _map_nlist_cpu( const int & nloc, const int & nnei); +template +static void +_map_nei_info_cpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * idx_mapping, + const int & nloc, + const int & nnei, + const int & ntypes, + const bool & b_nlist_map); + template static void _prepare_coord_nlist_cpu( @@ -252,6 +286,19 @@ _map_nlist_gpu( const int & nloc, const int & nnei); +template +static void +_map_nei_info_gpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * idx_mapping, + const int & nloc, + const int & nnei, + const int & ntypes, + const bool & b_nlist_map); + template static void _prepare_coord_nlist_gpu( @@ -326,6 +373,19 @@ _map_nlist_gpu_rocm( const int & nloc, const int & nnei); +template +static void +_map_nei_info_gpu_rocm( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * idx_mapping, + const int & nloc, + const int & nnei, + const int & ntypes, + const bool & b_nlist_map); + template static void _prepare_coord_nlist_gpu_rocm( @@ -869,7 +929,7 @@ class ProdEnvMatROp : public OpKernel { frame_nall, mem_cpy, mem_nnei, max_nbor_size, box, mesh_tensor.flat().data(), nloc, nei_mode, rcut, max_cpy_trial, max_nnei_trial); // launch the cpu compute function - prod_env_mat_r_cpu( + deepmd::prod_env_mat_r_cpu( em, em_deriv, rij, nlist, coord, type, inlist, max_nbor_size, avg, std, nloc, frame_nall, rcut, rcut_smth, sec); if(b_nlist_map) _map_nlist_cpu(nlist, &idx_mapping[0], nloc, nnei); @@ -896,7 +956,314 @@ class ProdEnvMatROp : public OpKernel { int * nbor_list_dev = NULL; }; +template +class ProdEnvMatAMixOp : public OpKernel { +public: + explicit ProdEnvMatAMixOp(OpKernelConstruction* context) : OpKernel(context) { + float nloc_f, nall_f; + OP_REQUIRES_OK(context, context->GetAttr("rcut_a", &rcut_a)); + OP_REQUIRES_OK(context, context->GetAttr("rcut_r", &rcut_r)); + OP_REQUIRES_OK(context, context->GetAttr("rcut_r_smth", &rcut_r_smth)); + OP_REQUIRES_OK(context, context->GetAttr("sel_a", &sel_a)); + OP_REQUIRES_OK(context, context->GetAttr("sel_r", &sel_r)); + // OP_REQUIRES_OK(context, context->GetAttr("nloc", &nloc_f)); + // OP_REQUIRES_OK(context, context->GetAttr("nall", &nall_f)); + deepmd::cum_sum (sec_a, sel_a); + deepmd::cum_sum (sec_r, sel_r); + ndescrpt_a = sec_a.back() * 4; + ndescrpt_r = sec_r.back() * 1; + ndescrpt = ndescrpt_a + ndescrpt_r; + nnei_a = sec_a.back(); + nnei_r = sec_r.back(); + nnei = nnei_a + nnei_r; + max_nbor_size = 1024; + max_cpy_trial = 100; + mem_cpy = 256; + max_nnei_trial = 100; + mem_nnei = 256; + } + void Compute(OpKernelContext* context) override { + deepmd::safe_compute(context, [this](OpKernelContext* context) {this->_Compute(context);}); + } + + void _Compute(OpKernelContext* context) { + // Grab the input tensor + int context_input_index = 0; + const Tensor& coord_tensor = context->input(context_input_index++); + const Tensor& type_tensor = context->input(context_input_index++); + const Tensor& natoms_tensor = context->input(context_input_index++); + const Tensor& box_tensor = context->input(context_input_index++); + const Tensor& mesh_tensor = context->input(context_input_index++); + const Tensor& avg_tensor = context->input(context_input_index++); + const Tensor& std_tensor = context->input(context_input_index++); + // set size of the sample. assume 't' is [[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]]], then shape(t) ==> [2, 2, 3] + OP_REQUIRES (context, (coord_tensor.shape().dims() == 2), errors::InvalidArgument ("Dim of coord should be 2")); + OP_REQUIRES (context, (type_tensor.shape().dims() == 2), errors::InvalidArgument ("Dim of type should be 2")); + OP_REQUIRES (context, (natoms_tensor.shape().dims() == 1), errors::InvalidArgument ("Dim of natoms should be 1")); + OP_REQUIRES (context, (box_tensor.shape().dims() == 2), errors::InvalidArgument ("Dim of box should be 2")); + OP_REQUIRES (context, (mesh_tensor.shape().dims() == 1), errors::InvalidArgument ("Dim of mesh should be 1")); + OP_REQUIRES (context, (avg_tensor.shape().dims() == 2), errors::InvalidArgument ("Dim of avg should be 2")); + OP_REQUIRES (context, (std_tensor.shape().dims() == 2), errors::InvalidArgument ("Dim of std should be 2")); + OP_REQUIRES (context, (sec_r.back() == 0), errors::InvalidArgument ("Rotational free descriptor only support all-angular information: sel_r should be all zero.")); + OP_REQUIRES (context, (natoms_tensor.shape().dim_size(0) >= 3), errors::InvalidArgument ("number of atoms should be larger than (or equal to) 3")); + DeviceFunctor() ( + device, + context->eigen_device() + ); + const int * natoms = natoms_tensor.flat().data(); + int nloc = natoms[0]; + int nall = natoms[1]; + int ntypes = natoms_tensor.shape().dim_size(0) - 2; + int nsamples = coord_tensor.shape().dim_size(0); + //// check the sizes + OP_REQUIRES (context, (nsamples == type_tensor.shape().dim_size(0)), errors::InvalidArgument ("number of samples should match")); + OP_REQUIRES (context, (nsamples == box_tensor.shape().dim_size(0)), errors::InvalidArgument ("number of samples should match")); + OP_REQUIRES (context, (ntypes == avg_tensor.shape().dim_size(0)), errors::InvalidArgument ("number of avg should be ntype")); + OP_REQUIRES (context, (ntypes == std_tensor.shape().dim_size(0)), errors::InvalidArgument ("number of std should be ntype")); + + OP_REQUIRES (context, (nall * 3 == coord_tensor.shape().dim_size(1)), errors::InvalidArgument ("number of atoms should match")); + OP_REQUIRES (context, (nall == type_tensor.shape().dim_size(1)), errors::InvalidArgument ("number of atoms should match")); + OP_REQUIRES (context, (9 == box_tensor.shape().dim_size(1)), errors::InvalidArgument ("number of box should be 9")); + OP_REQUIRES (context, (ndescrpt == avg_tensor.shape().dim_size(1)), errors::InvalidArgument ("number of avg should be ndescrpt")); + OP_REQUIRES (context, (ndescrpt == std_tensor.shape().dim_size(1)), errors::InvalidArgument ("number of std should be ndescrpt")); + + OP_REQUIRES (context, (1 == int(sel_a.size())), errors::InvalidArgument ("the length of sel array should be 1 in this op")); + OP_REQUIRES (context, (1 == int(sel_r.size())), errors::InvalidArgument ("the length of sel array should be 1 in this op")); + + int nei_mode = 0; + bool b_nlist_map = false; + if (mesh_tensor.shape().dim_size(0) == 16) { + // lammps neighbor list + nei_mode = 3; + } + else if (mesh_tensor.shape().dim_size(0) == 6) { + // manual copied pbc + assert (nloc == nall); + nei_mode = 1; + b_nlist_map = true; + } + else if (mesh_tensor.shape().dim_size(0) == 0) { + // no pbc + assert (nloc == nall); + nei_mode = -1; + } + else { + throw deepmd::deepmd_exception("invalid mesh tensor"); + } + + // Create output tensors + TensorShape descrpt_shape ; + descrpt_shape.AddDim (nsamples); + descrpt_shape.AddDim (int_64(nloc) * ndescrpt); + TensorShape descrpt_deriv_shape ; + descrpt_deriv_shape.AddDim (nsamples); + descrpt_deriv_shape.AddDim (int_64(nloc) * ndescrpt * 3); + TensorShape rij_shape ; + rij_shape.AddDim (nsamples); + rij_shape.AddDim (int_64(nloc) * nnei * 3); + TensorShape nlist_shape ; + nlist_shape.AddDim (nsamples); + nlist_shape.AddDim (int_64(nloc) * nnei); + TensorShape ntype_shape ; + ntype_shape.AddDim (nsamples); + ntype_shape.AddDim (nloc * nnei); + TensorShape nmask_shape ; + nmask_shape.AddDim (nsamples); + nmask_shape.AddDim (nloc * nnei); + // define output tensor + int context_output_index = 0; + Tensor* descrpt_tensor = NULL; + Tensor* descrpt_deriv_tensor = NULL; + Tensor* rij_tensor = NULL; + Tensor* nlist_tensor = NULL; + Tensor* ntype_tensor = NULL; + Tensor* nmask_tensor = NULL; + OP_REQUIRES_OK(context, context->allocate_output( + context_output_index++, + descrpt_shape, + &descrpt_tensor)); + OP_REQUIRES_OK(context, context->allocate_output( + context_output_index++, + descrpt_deriv_shape, + &descrpt_deriv_tensor)); + OP_REQUIRES_OK(context, context->allocate_output( + context_output_index++, + rij_shape, + &rij_tensor)); + OP_REQUIRES_OK(context, context->allocate_output( + context_output_index++, + nlist_shape, + &nlist_tensor)); + OP_REQUIRES_OK(context, context->allocate_output( + context_output_index++, + ntype_shape, + &ntype_tensor)); + OP_REQUIRES_OK(context, context->allocate_output( + context_output_index++, + nmask_shape, + &nmask_tensor)); + + FPTYPE * p_em = descrpt_tensor->flat().data(); + FPTYPE * p_em_deriv = descrpt_deriv_tensor->flat().data(); + FPTYPE * p_rij = rij_tensor->flat().data(); + int * p_nlist = nlist_tensor->flat().data(); + int * p_ntype = ntype_tensor->flat().data(); + FPTYPE * p_nmask = nmask_tensor->flat().data(); + const FPTYPE * p_coord = coord_tensor.flat().data(); + const FPTYPE * p_box = box_tensor.flat().data(); + const FPTYPE * avg = avg_tensor.flat().data(); + const FPTYPE * std = std_tensor.flat().data(); + const int * p_type = type_tensor.flat().data(); + + // loop over samples + for(int_64 ff = 0; ff < nsamples; ++ff){ + FPTYPE * em = p_em + ff*nloc*ndescrpt; + FPTYPE * em_deriv = p_em_deriv + ff*nloc*ndescrpt*3; + FPTYPE * rij = p_rij + ff*nloc*nnei*3; + int * nlist = p_nlist + ff*nloc*nnei; + int * ntype = p_ntype + ff*nloc*nnei; + FPTYPE * nmask = p_nmask + ff*nloc*nnei; + const FPTYPE * coord = p_coord + ff*nall*3; + const FPTYPE * box = p_box + ff*9; + const int * type = p_type + ff*nall; + + if(device == "GPU") { + #if GOOGLE_CUDA + int * idx_mapping = NULL; + int * ilist = NULL, * numneigh = NULL; + int ** firstneigh = NULL; + deepmd::malloc_device_memory(firstneigh, nloc); + int * jlist = NULL; + FPTYPE * coord_cpy; + int * type_cpy; + int frame_nall = nall; + int mesh_tensor_size = static_cast(mesh_tensor.NumElements()); + std::vector tensor_list(7); + Tensor fake_type; // all zeros + TensorShape fake_type_shape; + fake_type_shape.AddDim(nall); + OP_REQUIRES_OK(context, context->allocate_temp(DT_INT32, fake_type_shape, &fake_type)); + deepmd::memset_device_memory(fake_type.flat().data(), 0, nall); + const int * f_type = fake_type.flat().data(); + // prepare coord and nlist + _prepare_coord_nlist_gpu( + context, &tensor_list[0], &coord, coord_cpy, &f_type, type_cpy, idx_mapping, + gpu_inlist, ilist, numneigh, firstneigh, jlist, nbor_list_dev, + frame_nall, mem_cpy, mem_nnei, max_nbor_size, + box, mesh_tensor.flat().data(), mesh_tensor_size, nloc, nei_mode, rcut_r, max_cpy_trial, max_nnei_trial); + + // allocate temp memory, temp memory must not be used after this operation! + Tensor int_temp; + TensorShape int_shape; + int_shape.AddDim(sec_a.size() + int_64(nloc) * sec_a.size() + nloc); + OP_REQUIRES_OK(context, context->allocate_temp(DT_INT32, int_shape, &int_temp)); + Tensor uint64_temp; + TensorShape uint64_shape; + uint64_shape.AddDim(int_64(nloc) * max_nbor_size * 2); + OP_REQUIRES_OK(context, context->allocate_temp(DT_UINT64, uint64_shape, &uint64_temp)); + array_int = int_temp.flat().data(); + array_longlong = uint64_temp.flat().data(); + + // launch the gpu(nv) compute function + deepmd::prod_env_mat_a_mix_gpu_cuda( + em, em_deriv, rij, nlist, + coord, f_type, type, gpu_inlist, array_int, array_longlong, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a); + _map_nei_info_gpu(nlist, ntype, nmask, type, idx_mapping, nloc, nnei, ntypes, b_nlist_map); + deepmd::delete_device_memory(firstneigh); + #endif //GOOGLE_CUDA + + #if TENSORFLOW_USE_ROCM + int * idx_mapping = NULL; + int * ilist = NULL, * numneigh = NULL; + int ** firstneigh = NULL; + deepmd::malloc_device_memory(firstneigh, nloc); + int * jlist = NULL; + FPTYPE * coord_cpy; + int * type_cpy; + int frame_nall = nall; + int mesh_tensor_size = static_cast(mesh_tensor.NumElements()); + std::vector tensor_list(7); + Tensor fake_type; // all zeros + TensorShape fake_type_shape; + fake_type_shape.AddDim(nall); + OP_REQUIRES_OK(context, context->allocate_temp(DT_INT32, fake_type_shape, &fake_type)); + deepmd::memset_device_memory(fake_type.flat().data(), 0, nall); + const int * f_type = fake_type.flat().data(); + // prepare coord and nlist + _prepare_coord_nlist_gpu_rocm( + context, &tensor_list[0], &coord, coord_cpy, &f_type, type_cpy, idx_mapping, + gpu_inlist, ilist, numneigh, firstneigh, jlist, nbor_list_dev, + frame_nall, mem_cpy, mem_nnei, max_nbor_size, + box, mesh_tensor.flat().data(), mesh_tensor_size, nloc, nei_mode, rcut_r, max_cpy_trial, max_nnei_trial); + + // allocate temp memory, temp memory must not be used after this operation! + Tensor int_temp; + TensorShape int_shape; + int_shape.AddDim(sec_a.size() + int_64(nloc) * sec_a.size() + nloc); + OP_REQUIRES_OK(context, context->allocate_temp(DT_INT32, int_shape, &int_temp)); + Tensor uint64_temp; + TensorShape uint64_shape; + uint64_shape.AddDim(int_64(nloc) * max_nbor_size * 2); + OP_REQUIRES_OK(context, context->allocate_temp(DT_UINT64, uint64_shape, &uint64_temp)); + array_int = int_temp.flat().data(); + array_longlong = uint64_temp.flat().data(); + + // launch the gpu(nv) compute function + deepmd::prod_env_mat_a_mix_gpu_rocm( + em, em_deriv, rij, nlist, + coord, f_type, type, gpu_inlist, array_int, array_longlong, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a); + _map_nei_info_gpu_rocm(nlist, ntype, nmask, type, idx_mapping, nloc, nnei, ntypes, b_nlist_map); + deepmd::delete_device_memory(firstneigh); + #endif //TENSORFLOW_USE_ROCM + } + else if (device == "CPU") { + deepmd::InputNlist inlist; + // some buffers, be freed after the evaluation of this frame + std::vector idx_mapping; + std::vector ilist(nloc), numneigh(nloc); + std::vector firstneigh(nloc); + std::vector> jlist(nloc); + std::vector coord_cpy; + std::vector type_cpy; + int frame_nall = nall; + std::vector fake_type(nall, 0); + const int * f_type = &fake_type[0]; + // prepare coord and nlist + _prepare_coord_nlist_cpu( + context, &coord, coord_cpy, &f_type, type_cpy, idx_mapping, + inlist, ilist, numneigh, firstneigh, jlist, + frame_nall, mem_cpy, mem_nnei, max_nbor_size, + box, mesh_tensor.flat().data(), nloc, nei_mode, rcut_r, max_cpy_trial, max_nnei_trial); + // launch the cpu compute function + deepmd::prod_env_mat_a_mix_cpu( + em, em_deriv, rij, nlist, + coord, f_type, type, inlist, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a); + // do nlist mapping if coords were copied + _map_nei_info_cpu(nlist, ntype, nmask, type, &idx_mapping[0], nloc, nnei, ntypes, b_nlist_map); + } + } + } + +///////////////////////////////////////////////////////////////////////////////////////////// +private: + float rcut_a; + float rcut_r; + float rcut_r_smth; + std::vector sel_r; + std::vector sel_a; + std::vector sec_a; + std::vector sec_r; + int ndescrpt, ndescrpt_a, ndescrpt_r; + int nnei, nnei_a, nnei_r, nloc, nall, max_nbor_size; + int mem_cpy, max_cpy_trial; + int mem_nnei, max_nnei_trial; + std::string device; + int * array_int = NULL; + unsigned long long * array_longlong = NULL; + deepmd::InputNlist gpu_inlist; + int * nbor_list_dev = NULL; +}; template @@ -989,6 +1356,22 @@ _map_nlist_cpu( } } +template +static void +_map_nei_info_cpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * idx_mapping, + const int & nloc, + const int & nnei, + const int & ntypes, + const bool & b_nlist_map) +{ + deepmd::use_nei_info_cpu(nlist, ntype, nmask, type, idx_mapping, nloc, nnei, ntypes, b_nlist_map); +} + template static void _prepare_coord_nlist_cpu( @@ -1188,6 +1571,22 @@ _map_nlist_gpu( deepmd::use_nlist_map(nlist, idx_mapping, nloc, nnei); } +template +static void +_map_nei_info_gpu( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * idx_mapping, + const int & nloc, + const int & nnei, + const int & ntypes, + const bool & b_nlist_map) +{ + deepmd::use_nei_info_gpu(nlist, ntype, nmask, type, idx_mapping, nloc, nnei, ntypes, b_nlist_map); +} + template static void _prepare_coord_nlist_gpu( @@ -1403,6 +1802,23 @@ _map_nlist_gpu_rocm( deepmd::use_nlist_map(nlist, idx_mapping, nloc, nnei); } +template +static void +_map_nei_info_gpu_rocm( + int * nlist, + int * ntype, + FPTYPE * nmask, + const int * type, + const int * idx_mapping, + const int & nloc, + const int & nnei, + const int & ntypes, + const bool & b_nlist_map) +{ + deepmd::use_nei_info_gpu_rocm(nlist, ntype, nmask, type, idx_mapping, nloc, nnei, ntypes, b_nlist_map); +} + + template static void _prepare_coord_nlist_gpu_rocm( @@ -1484,6 +1900,9 @@ REGISTER_KERNEL_BUILDER( REGISTER_KERNEL_BUILDER( \ Name("ProdEnvMatR").Device(DEVICE_CPU).TypeConstraint("T"), \ ProdEnvMatROp); \ +REGISTER_KERNEL_BUILDER( \ + Name("ProdEnvMatAMix").Device(DEVICE_CPU).TypeConstraint("T"), \ + ProdEnvMatAMixOp); \ REGISTER_KERNEL_BUILDER( \ Name("DescrptSeA").Device(DEVICE_CPU).TypeConstraint("T"), \ ProdEnvMatAOp); \ @@ -1506,6 +1925,9 @@ REGISTER_KERNEL_BUILDER( REGISTER_KERNEL_BUILDER( \ Name("ProdEnvMatR").Device(DEVICE_GPU).TypeConstraint("T").HostMemory("natoms").HostMemory("box"), \ ProdEnvMatROp); \ +REGISTER_KERNEL_BUILDER( \ + Name("ProdEnvMatAMix").Device(DEVICE_GPU).TypeConstraint("T").HostMemory("natoms").HostMemory("box"), \ + ProdEnvMatAMixOp); \ REGISTER_KERNEL_BUILDER( \ Name("DescrptSeA").Device(DEVICE_GPU).TypeConstraint("T").HostMemory("natoms").HostMemory("box"), \ ProdEnvMatAOp); \ diff --git a/source/tests/common.py b/source/tests/common.py index e767f8a3eb..1187a11036 100644 --- a/source/tests/common.py +++ b/source/tests/common.py @@ -24,23 +24,49 @@ def j_loader(filename): def del_data(): if os.path.isdir('system'): shutil.rmtree('system') + if os.path.isdir('system_large_batch'): + shutil.rmtree('system_large_batch') -def gen_data(nframes = 1) : +def gen_data(nframes = 1, large_batch_mode=False) : tmpdata = Data(rand_pert = 0.1, seed = 1, nframes = nframes) sys = dpdata.LabeledSystem() - sys.data['atom_names'] = ['foo', 'bar'] - sys.data['coords'] = tmpdata.coord - sys.data['atom_types'] = tmpdata.atype - sys.data['cells'] = tmpdata.cell - nframes = tmpdata.nframes - natoms = tmpdata.natoms - sys.data['coords'] = sys.data['coords'].reshape([nframes,natoms,3]) - sys.data['cells'] = sys.data['cells'].reshape([nframes,3,3]) - sys.data['energies'] = np.zeros([nframes,1]) - sys.data['forces'] = np.zeros([nframes,natoms,3]) - sys.to_deepmd_npy('system', prec=np.float64) - np.save('system/set.000/fparam.npy', tmpdata.fparam) - np.save('system/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) + if not large_batch_mode: + sys.data['atom_names'] = ['foo', 'bar'] + sys.data['coords'] = tmpdata.coord + sys.data['atom_types'] = tmpdata.atype + sys.data['cells'] = tmpdata.cell + nframes = tmpdata.nframes + natoms = tmpdata.natoms + sys.data['coords'] = sys.data['coords'].reshape([nframes,natoms,3]) + sys.data['cells'] = sys.data['cells'].reshape([nframes,3,3]) + sys.data['energies'] = np.zeros([nframes,1]) + sys.data['forces'] = np.zeros([nframes,natoms,3]) + sys.to_deepmd_npy('system', prec=np.float64) + np.save('system/set.000/fparam.npy', tmpdata.fparam) + np.save('system/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) + else: + real_type_map = ['foo', 'bar'] + sys.data['atom_names'] = ['X'] + sys.data['coords'] = tmpdata.coord + sys.data['atom_types'] = np.zeros_like(tmpdata.atype) + sys.data['cells'] = tmpdata.cell + nframes = tmpdata.nframes + natoms = tmpdata.natoms + sys.data['coords'] = sys.data['coords'].reshape([nframes, natoms, 3]) + sys.data['cells'] = sys.data['cells'].reshape([nframes, 3, 3]) + sys.data['energies'] = np.zeros([nframes, 1]) + sys.data['forces'] = np.zeros([nframes, natoms, 3]) + sys.to_deepmd_npy('system_large_batch', prec=np.float64) + real_atom_numbs = np.array([0 for i in range(len(real_type_map))]) + for i in range(len(real_type_map)): + real_atom_numbs[i] = (tmpdata.atype == i).sum() + np.savetxt('system_large_batch/type_map.raw', real_type_map, fmt='%s') + np.save('system_large_batch/set.000/real_atom_types.npy', tmpdata.atype.reshape(1, -1).repeat(nframes, 0)) + np.save('system_large_batch/set.000/real_atom_numbs.npy', real_atom_numbs.reshape(1, -1).repeat(nframes, 0)) + np.save('system_large_batch/set.000/fparam.npy', tmpdata.fparam) + np.save('system_large_batch/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) + + class Data(): def __init__ (self, diff --git a/source/tests/test_data_large_batch.py b/source/tests/test_data_large_batch.py new file mode 100644 index 0000000000..084c890280 --- /dev/null +++ b/source/tests/test_data_large_batch.py @@ -0,0 +1,173 @@ +import dpdata, os, sys, unittest +import numpy as np +from deepmd.env import tf +import pickle +from common import Data, gen_data, j_loader + +from deepmd.utils.data_system import DeepmdDataSystem +from deepmd.descriptor import DescrptSeAtten +from deepmd.common import data_requirement +from deepmd.fit import EnerFitting +from deepmd.model import EnerModel +from deepmd.utils.type_embed import TypeEmbedNet +from deepmd.common import j_must_have + +GLOBAL_ENER_FLOAT_PRECISION = tf.float64 +GLOBAL_TF_FLOAT_PRECISION = tf.float64 +GLOBAL_NP_FLOAT_PRECISION = np.float64 + + +class TestDataLargeBatch(tf.test.TestCase): + def setUp(self): + gen_data(large_batch_mode=True) + + def test_data_large_batch(self): + jfile = 'water_se_atten_large_batch.json' + jdata = j_loader(jfile) + + systems = j_must_have(jdata, 'systems') + set_pfx = j_must_have(jdata, 'set_prefix') + batch_size = j_must_have(jdata, 'batch_size') + test_size = j_must_have(jdata, 'numb_test') + batch_size = 1 + test_size = 1 + stop_batch = j_must_have(jdata, 'stop_batch') + rcut = j_must_have(jdata['model']['descriptor'], 'rcut') + + data = DeepmdDataSystem(systems, batch_size, test_size, rcut) + data_requirement = {'energy': {'ndof': 1, + 'atomic': False, + 'must': False, + 'high_prec': True, + 'type_sel': None, + 'repeat': 1, + 'default': 0.0}, + 'force': {'ndof': 3, + 'atomic': True, + 'must': False, + 'high_prec': False, + 'type_sel': None, + 'repeat': 1, + 'default': 0.0}, + 'virial': {'ndof': 9, + 'atomic': False, + 'must': False, + 'high_prec': False, + 'type_sel': None, + 'repeat': 1, + 'default': 0.0}, + 'atom_ener': {'ndof': 1, + 'atomic': True, + 'must': False, + 'high_prec': False, + 'type_sel': None, + 'repeat': 1, + 'default': 0.0}, + 'atom_pref': {'ndof': 1, + 'atomic': True, + 'must': False, + 'high_prec': False, + 'type_sel': None, + 'repeat': 3, + 'default': 0.0}} + data.add_dict(data_requirement) + + test_data = data.get_test() + numb_test = 1 + + jdata['model']['descriptor'].pop('type', None) + jdata['model']['descriptor']['ntypes'] = 2 + descrpt = DescrptSeAtten(**jdata['model']['descriptor'], uniform_seed=True) + jdata['model']['fitting_net']['descrpt'] = descrpt + fitting = EnerFitting(**jdata['model']['fitting_net'], uniform_seed=True) + typeebd_param = jdata['model']['type_embedding'] + typeebd = TypeEmbedNet( + neuron=typeebd_param['neuron'], + resnet_dt=typeebd_param['resnet_dt'], + seed=typeebd_param['seed'], + uniform_seed=True, + use_linear=True, + padding=True) + model = EnerModel(descrpt, fitting, typeebd) + + # model._compute_dstats([test_data['coord']], [test_data['box']], [test_data['type']], [test_data['natoms_vec']], [test_data['default_mesh']]) + input_data = {'coord': [test_data['coord']], + 'box': [test_data['box']], + 'type': [test_data['type']], + 'natoms_vec': [test_data['natoms_vec']], + 'default_mesh': [test_data['default_mesh']], + 'real_natoms_vec': [test_data['real_natoms_vec']] + } + model._compute_input_stat(input_data, large_batch_mode=True) + model.descrpt.bias_atom_e = np.array([0., 0.]) + + t_energy = tf.placeholder(GLOBAL_ENER_FLOAT_PRECISION, [None], name='t_energy') + t_force = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_force') + t_virial = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_virial') + t_atom_ener = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_atom_ener') + t_coord = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='i_coord') + t_type = tf.placeholder(tf.int32, [None], name='i_type') + t_natoms = tf.placeholder(tf.int32, [model.ntypes + 2], name='i_natoms') + t_box = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, 9], name='i_box') + t_mesh = tf.placeholder(tf.int32, [None], name='i_mesh') + is_training = tf.placeholder(tf.bool) + t_fparam = None + inputs_dict = {} + + model_pred \ + = model.build(t_coord, + t_type, + t_natoms, + t_box, + t_mesh, + inputs_dict, + suffix="se_atten", + reuse=False) + + energy = model_pred['energy'] + force = model_pred['force'] + virial = model_pred['virial'] + atom_ener = model_pred['atom_ener'] + + feed_dict_test = {t_energy: np.reshape(test_data['energy'][:numb_test], [-1]), + t_force: np.reshape(test_data['force'][:numb_test, :], [-1]), + t_virial: np.reshape(test_data['virial'][:numb_test, :], [-1]), + t_atom_ener: np.reshape(test_data['atom_ener'][:numb_test, :], [-1]), + t_coord: np.reshape(test_data['coord'][:numb_test, :], [-1]), + t_box: test_data['box'][:numb_test, :], + t_type: np.reshape(test_data['type'][:numb_test, :], [-1]), + t_natoms: test_data['natoms_vec'], + t_mesh: test_data['default_mesh'], + is_training: False} + + + sess = self.test_session().__enter__() + sess.run(tf.global_variables_initializer()) + [e, f, v] = sess.run([energy, force, virial], + feed_dict=feed_dict_test) + # print(sess.run(model.type_embedding)) + # np.savetxt('tmp.out', sess.run(descrpt.dout, feed_dict = feed_dict_test), fmt='%.10e') + # # print(sess.run(model.atype_embed, feed_dict = feed_dict_test)) + # print(sess.run(fitting.inputs, feed_dict = feed_dict_test)) + # print(sess.run(fitting.outs, feed_dict = feed_dict_test)) + # print(sess.run(fitting.atype_embed, feed_dict = feed_dict_test)) + + e = e.reshape([-1]) + f = f.reshape([-1]) + v = v.reshape([-1]) + np.savetxt('e.out', e.reshape([1, -1]), delimiter=',') + np.savetxt('f.out', f.reshape([1, -1]), delimiter=',') + np.savetxt('v.out', v.reshape([1, -1]), delimiter=',') + + refe = [6.12188445792698e+01] + reff = [-2.7590100298321299e-03, -2.7392865283639755e-03, 8.5672424478673337e-05, 7.3154109032780492e-03, 7.6754109031673332e-04, -1.0882393042639207e-03, 9.8633073531477645e-03, 3.6631966083397029e-03, -2.2379079261940034e-04, -4.2393697523149913e-03, 4.9491210390296492e-04, 1.6970049039709007e-04, -8.9021867696626039e-03, -4.7967452269658322e-03, 9.2569990351204447e-04, -1.2781517046160920e-03, 2.6103819527704053e-03, 1.3095727849551296e-04] + refv = [-1.0171833662757776e-02, -6.7981543912862021e-03, 6.1480942994810296e-04, -6.7981543912861942e-03, 3.0092645628232335e-03, 3.8060849919518031e-04, 6.1480942994810383e-04, 3.8060849919518036e-04, -5.6890657188056002e-05] + + refe = np.reshape(refe, [-1]) + reff = np.reshape(reff, [-1]) + refv = np.reshape(refv, [-1]) + + places = 10 + np.testing.assert_almost_equal(e, refe, places) + np.testing.assert_almost_equal(f, reff, places) + np.testing.assert_almost_equal(v, refv, places) diff --git a/source/tests/test_descrpt_se_atten.py b/source/tests/test_descrpt_se_atten.py new file mode 100644 index 0000000000..6523766bb8 --- /dev/null +++ b/source/tests/test_descrpt_se_atten.py @@ -0,0 +1,248 @@ +import dpdata, os, sys, unittest +import numpy as np +from deepmd.env import tf +import pickle +from common import Data, gen_data, j_loader + +from deepmd.utils.data_system import DataSystem +from deepmd.descriptor import DescrptSeAtten +from deepmd.fit import EnerFitting +from deepmd.model import EnerModel +from deepmd.common import j_must_have +from deepmd.utils.type_embed import embed_atom_type, TypeEmbedNet + +GLOBAL_ENER_FLOAT_PRECISION = tf.float64 +GLOBAL_TF_FLOAT_PRECISION = tf.float64 +GLOBAL_NP_FLOAT_PRECISION = np.float64 + + +class TestModel(tf.test.TestCase): + def setUp(self): + gen_data(nframes=2) + + def test_descriptor_two_sides(self): + jfile = 'water_se_atten.json' + jdata = j_loader(jfile) + + systems = j_must_have(jdata, 'systems') + set_pfx = j_must_have(jdata, 'set_prefix') + batch_size = j_must_have(jdata, 'batch_size') + test_size = j_must_have(jdata, 'numb_test') + batch_size = 2 + test_size = 1 + stop_batch = j_must_have(jdata, 'stop_batch') + rcut = j_must_have(jdata['model']['descriptor'], 'rcut') + sel = j_must_have(jdata['model']['descriptor'], 'sel') + ntypes = len(jdata['model']['type_map']) + + data = DataSystem(systems, set_pfx, batch_size, test_size, rcut, run_opt=None) + + test_data = data.get_test() + numb_test = 1 + + # set parameters + jdata['model']['descriptor']['neuron'] = [5, 5, 5] + jdata['model']['descriptor']['axis_neuron'] = 2 + typeebd_param = {'neuron': [5, 5, 5], + 'resnet_dt': False, + 'seed': 1, + } + + # init models + typeebd = TypeEmbedNet( + neuron=typeebd_param['neuron'], + resnet_dt=typeebd_param['resnet_dt'], + seed=typeebd_param['seed'], + uniform_seed=True, + use_linear=True, + padding=True + ) + + jdata['model']['descriptor'].pop('type', None) + jdata['model']['descriptor']['ntypes'] = ntypes + descrpt = DescrptSeAtten(**jdata['model']['descriptor'], uniform_seed=True) + + # model._compute_dstats([test_data['coord']], [test_data['box']], [test_data['type']], [test_data['natoms_vec']], [test_data['default_mesh']]) + input_data = {'coord': [test_data['coord']], + 'box': [test_data['box']], + 'type': [test_data['type']], + 'natoms_vec': [test_data['natoms_vec']], + 'default_mesh': [test_data['default_mesh']] + } + descrpt.bias_atom_e = data.compute_energy_shift() + + t_prop_c = tf.placeholder(tf.float32, [5], name='t_prop_c') + t_energy = tf.placeholder(GLOBAL_ENER_FLOAT_PRECISION, [None], name='t_energy') + t_force = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_force') + t_virial = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_virial') + t_atom_ener = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_atom_ener') + t_coord = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='i_coord') + t_type = tf.placeholder(tf.int32, [None], name='i_type') + t_natoms = tf.placeholder(tf.int32, [ntypes + 2], name='i_natoms') + t_box = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, 9], name='i_box') + t_mesh = tf.placeholder(tf.int32, [None], name='i_mesh') + is_training = tf.placeholder(tf.bool) + t_fparam = None + + type_embedding = typeebd.build( + ntypes, + suffix="_se_a_type_des_ebd_2sdies" + ) + + dout \ + = descrpt.build( + t_coord, + t_type, + t_natoms, + t_box, + t_mesh, + {'type_embedding': type_embedding}, + reuse=False, + suffix="_se_a_type_des_2sides" + ) + + feed_dict_test = {t_prop_c: test_data['prop_c'], + t_energy: test_data['energy'][:numb_test], + t_force: np.reshape(test_data['force'][:numb_test, :], [-1]), + t_virial: np.reshape(test_data['virial'][:numb_test, :], [-1]), + t_atom_ener: np.reshape(test_data['atom_ener'][:numb_test, :], [-1]), + t_coord: np.reshape(test_data['coord'][:numb_test, :], [-1]), + t_box: test_data['box'][:numb_test, :], + t_type: np.reshape(test_data['type'][:numb_test, :], [-1]), + t_natoms: test_data['natoms_vec'], + t_mesh: test_data['default_mesh'], + is_training: False} + + sess = self.test_session().__enter__() + sess.run(tf.global_variables_initializer()) + [model_dout] = sess.run([dout], + feed_dict=feed_dict_test) + model_dout = model_dout.reshape([-1]) + + ref_dout = [1.3503570575883254e-04, -9.3606804794552518e-05, -9.3606804794552518e-05, 6.4931435609575354e-05, -3.4432462227712845e-04, 2.3883309310633266e-04, -2.1612770334269806e-04, 1.4980041766865035e-04, + 5.1902342465554648e-04, -3.5995814159000579e-04, 1.0061650355705337e-04, -7.5148260042556979e-05, -7.5148260042556979e-05, 5.6249549384058458e-05, -2.7820514647114664e-04, 2.0819618461713165e-04, + -1.5698895407951743e-04, 1.1721016363267746e-04, 4.0972585703616773e-04, -3.0650763759131061e-04, 7.5599650998659526e-05, -5.8808888720672558e-05, -5.8808888720672558e-05, 4.5766209906762655e-05, + -2.1712714013251668e-04, 1.6899894453623564e-04, -1.2167120597162636e-04, 9.4648599144861605e-05, 3.2200758382615601e-04, -2.5060486486718734e-04, 1.1293831101452813e-04, -7.9512063028041913e-05, + -7.9512063028041913e-05, 5.5979262682797850e-05, -2.9058515610909440e-04, 2.0457554106366365e-04, -1.8732839505532627e-04, 1.3188376232775540e-04, 4.4448730317793450e-04, -3.1292650304617497e-04, + 1.3015885894252541e-04, -8.8816609587789126e-05, -8.8816609587789126e-05, 6.0613949400496957e-05, -3.2308121544925519e-04, 2.2046786823295058e-04, -2.1781481424814687e-04, 1.4862599684199924e-04, + 4.9955378034266583e-04, -3.4089120488765758e-04, 1.0160496779809329e-04, -7.4538471222199861e-05, -7.4538471222199861e-05, 5.4703671679263269e-05, -2.7394267959121653e-04, 2.0103409637607701e-04, + -1.6657135958432620e-04, 1.2219321453198225e-04, 4.1344754259964935e-04, -3.0339251136512270e-04] + + places = 10 + np.testing.assert_almost_equal(model_dout, ref_dout, places) + + def test_descriptor_one_side(self): + jfile = 'water_se_atten.json' + jdata = j_loader(jfile) + + systems = j_must_have(jdata, 'systems') + set_pfx = j_must_have(jdata, 'set_prefix') + batch_size = j_must_have(jdata, 'batch_size') + test_size = j_must_have(jdata, 'numb_test') + batch_size = 1 + test_size = 1 + stop_batch = j_must_have(jdata, 'stop_batch') + rcut = j_must_have(jdata['model']['descriptor'], 'rcut') + sel = j_must_have(jdata['model']['descriptor'], 'sel') + ntypes = len(jdata['model']['type_map']) + + data = DataSystem(systems, set_pfx, batch_size, test_size, rcut, run_opt=None) + + test_data = data.get_test() + numb_test = 1 + + # set parameters + jdata['model']['descriptor']['neuron'] = [5, 5, 5] + jdata['model']['descriptor']['axis_neuron'] = 2 + jdata['model']['descriptor']['type_one_side'] = True + typeebd_param = {'neuron': [5, 5, 5], + 'resnet_dt': False, + 'seed': 1, + } + + # init models + typeebd = TypeEmbedNet( + neuron=typeebd_param['neuron'], + resnet_dt=typeebd_param['resnet_dt'], + seed=typeebd_param['seed'], + uniform_seed=True, + use_linear=True, + padding=True + ) + + jdata['model']['descriptor'].pop('type', None) + jdata['model']['descriptor']['ntypes'] = ntypes + descrpt = DescrptSeAtten(**jdata['model']['descriptor'], uniform_seed=True) + + # model._compute_dstats([test_data['coord']], [test_data['box']], [test_data['type']], [test_data['natoms_vec']], [test_data['default_mesh']]) + input_data = {'coord': [test_data['coord']], + 'box': [test_data['box']], + 'type': [test_data['type']], + 'natoms_vec': [test_data['natoms_vec']], + 'default_mesh': [test_data['default_mesh']] + } + descrpt.bias_atom_e = data.compute_energy_shift() + + t_prop_c = tf.placeholder(tf.float32, [5], name='t_prop_c') + t_energy = tf.placeholder(GLOBAL_ENER_FLOAT_PRECISION, [None], name='t_energy') + t_force = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_force') + t_virial = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_virial') + t_atom_ener = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_atom_ener') + t_coord = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='i_coord') + t_type = tf.placeholder(tf.int32, [None], name='i_type') + t_natoms = tf.placeholder(tf.int32, [ntypes + 2], name='i_natoms') + t_box = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, 9], name='i_box') + t_mesh = tf.placeholder(tf.int32, [None], name='i_mesh') + is_training = tf.placeholder(tf.bool) + t_fparam = None + + type_embedding = typeebd.build( + ntypes, + suffix="_se_a_type_des_ebd_1side" + ) + + dout \ + = descrpt.build( + t_coord, + t_type, + t_natoms, + t_box, + t_mesh, + {'type_embedding': type_embedding}, + reuse=False, + suffix="_se_a_type_des_1side" + ) + + feed_dict_test = {t_prop_c: test_data['prop_c'], + t_energy: test_data['energy'][:numb_test], + t_force: np.reshape(test_data['force'][:numb_test, :], [-1]), + t_virial: np.reshape(test_data['virial'][:numb_test, :], [-1]), + t_atom_ener: np.reshape(test_data['atom_ener'][:numb_test, :], [-1]), + t_coord: np.reshape(test_data['coord'][:numb_test, :], [-1]), + t_box: test_data['box'][:numb_test, :], + t_type: np.reshape(test_data['type'][:numb_test, :], [-1]), + t_natoms: test_data['natoms_vec'], + t_mesh: test_data['default_mesh'], + is_training: False} + + sess = self.test_session().__enter__() + sess.run(tf.global_variables_initializer()) + [model_dout] = sess.run([dout], + feed_dict=feed_dict_test) + model_dout = model_dout.reshape([-1]) + + ref_dout = [8.9336098555659429e-05, -3.8921422089719007e-05, -3.8921422089719007e-05, 1.6975109833017758e-05, -2.9184951813034413e-04, 1.2724836941382651e-04, -1.8062533253590169e-04, 7.8681048972093648e-05, + 4.2206017420030542e-04, -1.8398310612921889e-04, 6.4996467281506633e-05, -3.0812041327073575e-05, -3.0812041327073575e-05, 1.4663988013438402e-05, -2.3274950984084172e-04, 1.1059587214865573e-04, + -1.3043761448464089e-04, 6.1788865409826698e-05, 3.2900269837104958e-04, -1.5623668424484728e-04, 5.0697927477465942e-05, -2.3511768544350768e-05, -2.3511768544350768e-05, 1.0919808814040025e-05, + -1.8622373494960208e-04, 8.6439275444049409e-05, -1.0326450661269683e-04, 4.7880797898768150e-05, 2.6230208262918372e-04, -1.2172811361250681e-04, 7.8240863239649707e-05, -3.2501260967978116e-05, + -3.2501260967978116e-05, 1.3502267073810926e-05, -2.5360559687597850e-04, 1.0535336854834091e-04, -1.6047265448841568e-04, 6.6660202062744658e-05, 3.6833864909272261e-04, -1.5301457671691837e-04, + 9.1148582997925288e-05, -3.6614945467066073e-05, -3.6614945467066073e-05, 1.4709958908948206e-05, -2.8364168092837332e-04, 1.1394466218003484e-04, -1.8721615730559043e-04, 7.5203967811613109e-05, + 4.1632420070310456e-04, -1.6724364343353009e-04, 6.9506193268190631e-05, -3.0228106532898472e-05, -3.0228106532898472e-05, 1.3156705594652870e-05, -2.3740975974826574e-04, 1.0328972070195332e-04, + -1.4218547815143072e-04, 6.1827596642872941e-05, 3.4031715116440432e-04, -1.4804591640658066e-04] + + places = 10 + np.testing.assert_almost_equal(model_dout, ref_dout, places) + + + + diff --git a/source/tests/test_model_se_atten.py b/source/tests/test_model_se_atten.py new file mode 100644 index 0000000000..9ae73f8a1c --- /dev/null +++ b/source/tests/test_model_se_atten.py @@ -0,0 +1,134 @@ +import dpdata, os, sys, unittest +import numpy as np +from deepmd.env import tf +import pickle +from common import Data, gen_data, j_loader + +from deepmd.utils.data_system import DataSystem +from deepmd.descriptor import DescrptSeAtten +from deepmd.fit import EnerFitting +from deepmd.model import EnerModel +from deepmd.utils.type_embed import TypeEmbedNet +from deepmd.common import j_must_have + +GLOBAL_ENER_FLOAT_PRECISION = tf.float64 +GLOBAL_TF_FLOAT_PRECISION = tf.float64 +GLOBAL_NP_FLOAT_PRECISION = np.float64 + + +class TestModel(tf.test.TestCase): + def setUp(self): + gen_data() + + def test_model(self): + jfile = 'water_se_atten.json' + jdata = j_loader(jfile) + + systems = j_must_have(jdata, 'systems') + set_pfx = j_must_have(jdata, 'set_prefix') + batch_size = j_must_have(jdata, 'batch_size') + test_size = j_must_have(jdata, 'numb_test') + batch_size = 1 + test_size = 1 + stop_batch = j_must_have(jdata, 'stop_batch') + rcut = j_must_have(jdata['model']['descriptor'], 'rcut') + + data = DataSystem(systems, set_pfx, batch_size, test_size, rcut, run_opt=None) + + test_data = data.get_test() + numb_test = 1 + + jdata['model']['descriptor'].pop('type', None) + jdata['model']['descriptor']['ntypes'] = 2 + descrpt = DescrptSeAtten(**jdata['model']['descriptor'], uniform_seed=True) + jdata['model']['fitting_net']['descrpt'] = descrpt + fitting = EnerFitting(**jdata['model']['fitting_net'], uniform_seed=True) + typeebd_param = jdata['model']['type_embedding'] + typeebd = TypeEmbedNet( + neuron=typeebd_param['neuron'], + resnet_dt=typeebd_param['resnet_dt'], + seed=typeebd_param['seed'], + uniform_seed=True, + use_linear=True, + padding=True) + model = EnerModel(descrpt, fitting, typeebd) + + # model._compute_dstats([test_data['coord']], [test_data['box']], [test_data['type']], [test_data['natoms_vec']], [test_data['default_mesh']]) + input_data = {'coord': [test_data['coord']], + 'box': [test_data['box']], + 'type': [test_data['type']], + 'natoms_vec': [test_data['natoms_vec']], + 'default_mesh': [test_data['default_mesh']] + } + model._compute_input_stat(input_data) + model.descrpt.bias_atom_e = data.compute_energy_shift() + + t_prop_c = tf.placeholder(tf.float32, [5], name='t_prop_c') + t_energy = tf.placeholder(GLOBAL_ENER_FLOAT_PRECISION, [None], name='t_energy') + t_force = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_force') + t_virial = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_virial') + t_atom_ener = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='t_atom_ener') + t_coord = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None], name='i_coord') + t_type = tf.placeholder(tf.int32, [None], name='i_type') + t_natoms = tf.placeholder(tf.int32, [model.ntypes + 2], name='i_natoms') + t_box = tf.placeholder(GLOBAL_TF_FLOAT_PRECISION, [None, 9], name='i_box') + t_mesh = tf.placeholder(tf.int32, [None], name='i_mesh') + is_training = tf.placeholder(tf.bool) + t_fparam = None + inputs_dict = {} + + model_pred \ + = model.build(t_coord, + t_type, + t_natoms, + t_box, + t_mesh, + inputs_dict, + suffix="se_atten", + reuse=False) + energy = model_pred['energy'] + force = model_pred['force'] + virial = model_pred['virial'] + atom_ener = model_pred['atom_ener'] + + feed_dict_test = {t_prop_c: test_data['prop_c'], + t_energy: test_data['energy'][:numb_test], + t_force: np.reshape(test_data['force'][:numb_test, :], [-1]), + t_virial: np.reshape(test_data['virial'][:numb_test, :], [-1]), + t_atom_ener: np.reshape(test_data['atom_ener'][:numb_test, :], [-1]), + t_coord: np.reshape(test_data['coord'][:numb_test, :], [-1]), + t_box: test_data['box'][:numb_test, :], + t_type: np.reshape(test_data['type'][:numb_test, :], [-1]), + t_natoms: test_data['natoms_vec'], + t_mesh: test_data['default_mesh'], + is_training: False} + sess = self.test_session().__enter__() + sess.run(tf.global_variables_initializer()) + [e, f, v] = sess.run([energy, force, virial], + feed_dict=feed_dict_test) + # print(sess.run(model.type_embedding)) + # np.savetxt('tmp.out', sess.run(descrpt.dout, feed_dict = feed_dict_test), fmt='%.10e') + # # print(sess.run(model.atype_embed, feed_dict = feed_dict_test)) + # print(sess.run(fitting.inputs, feed_dict = feed_dict_test)) + # print(sess.run(fitting.outs, feed_dict = feed_dict_test)) + # print(sess.run(fitting.atype_embed, feed_dict = feed_dict_test)) + + e = e.reshape([-1]) + f = f.reshape([-1]) + v = v.reshape([-1]) + np.savetxt('e.out', e.reshape([1, -1]), delimiter=',') + np.savetxt('f.out', f.reshape([1, -1]), delimiter=',') + np.savetxt('v.out', v.reshape([1, -1]), delimiter=',') + + refe = [6.12188445792698e+01] + reff = [-2.7590100298321299e-03, -2.7392865283639755e-03, 8.5672424478673337e-05, 7.3154109032780492e-03, 7.6754109031673332e-04, -1.0882393042639207e-03, 9.8633073531477645e-03, 3.6631966083397029e-03, -2.2379079261940034e-04, -4.2393697523149913e-03, 4.9491210390296492e-04, 1.6970049039709007e-04, -8.9021867696626039e-03, -4.7967452269658322e-03, 9.2569990351204447e-04, -1.2781517046160920e-03, 2.6103819527704053e-03, 1.3095727849551296e-04] + refv = [-1.0171833662757776e-02, -6.7981543912862021e-03, 6.1480942994810296e-04, -6.7981543912861942e-03, 3.0092645628232335e-03, 3.8060849919518031e-04, 6.1480942994810383e-04, 3.8060849919518036e-04, -5.6890657188056002e-05] + + refe = np.reshape(refe, [-1]) + reff = np.reshape(reff, [-1]) + refv = np.reshape(refv, [-1]) + + places = 10 + np.testing.assert_almost_equal(e, refe, places) + np.testing.assert_almost_equal(f, reff, places) + np.testing.assert_almost_equal(v, refv, places) diff --git a/source/tests/water_se_atten.json b/source/tests/water_se_atten.json new file mode 100644 index 0000000000..07d910e6b5 --- /dev/null +++ b/source/tests/water_se_atten.json @@ -0,0 +1,66 @@ +{ + "_comment": " model parameters", + "model" : { + "type_map": ["O", "H"], + "type_embedding":{ + "neuron": [2,4,8], + "resnet_dt": false, + "seed": 1 + }, + "descriptor" :{ + "type": "se_atten", + "sel": 120, + "rcut_smth": 5.80, + "rcut": 6.00, + "neuron": [25, 50, 100], + "resnet_dt": false, + "type_one_side": false, + "axis_neuron": 16, + "seed": 1, + "attn": 128, + "attn_layer": 2, + "attn_dotr": true, + "attn_mask": false + }, + "fitting_net" : { + "neuron": [240, 240, 240], + "resnet_dt": true, + "seed": 1 + } + }, + + + "_comment": " traing controls", + "systems": ["system"], + "set_prefix": "set", + "stop_batch": 1000000, + "batch_size": 1, + "start_lr": 0.005, + "decay_steps": 5000, + "decay_rate": 0.95, + + "start_pref_e": 0.02, + "limit_pref_e": 1, + "start_pref_f": 1000, + "limit_pref_f": 1, + "start_pref_v": 0, + "limit_pref_v": 0, + + "seed": 1, + + "_comment": " display and restart", + "_comment": " frequencies counted in batch", + "disp_file": "lcurve.out", + "disp_freq": 100, + "numb_test": 1, + "save_freq": 1000, + "save_ckpt": "model.ckpt", + "load_ckpt": "model.ckpt", + "disp_training": true, + "time_training": true, + "profiling": false, + "profiling_file": "timeline.json", + + "_comment": "that's all" +} + diff --git a/source/tests/water_se_atten_large_batch.json b/source/tests/water_se_atten_large_batch.json new file mode 100644 index 0000000000..a0664d7b4e --- /dev/null +++ b/source/tests/water_se_atten_large_batch.json @@ -0,0 +1,66 @@ +{ + "_comment": " model parameters", + "model" : { + "type_map": ["O", "H"], + "type_embedding":{ + "neuron": [2,4,8], + "resnet_dt": false, + "seed": 1 + }, + "descriptor" :{ + "type": "se_atten", + "sel": 120, + "rcut_smth": 5.80, + "rcut": 6.00, + "neuron": [25, 50, 100], + "resnet_dt": false, + "type_one_side": false, + "axis_neuron": 16, + "seed": 1, + "attn": 128, + "attn_layer": 2, + "attn_dotr": true, + "attn_mask": false + }, + "fitting_net" : { + "neuron": [240, 240, 240], + "resnet_dt": true, + "seed": 1 + } + }, + + + "_comment": " traing controls", + "systems": ["system_large_batch"], + "set_prefix": "set", + "stop_batch": 1000000, + "batch_size": 1, + "start_lr": 0.005, + "decay_steps": 5000, + "decay_rate": 0.95, + + "start_pref_e": 0.02, + "limit_pref_e": 1, + "start_pref_f": 1000, + "limit_pref_f": 1, + "start_pref_v": 0, + "limit_pref_v": 0, + + "seed": 1, + + "_comment": " display and restart", + "_comment": " frequencies counted in batch", + "disp_file": "lcurve.out", + "disp_freq": 100, + "numb_test": 1, + "save_freq": 1000, + "save_ckpt": "model.ckpt", + "load_ckpt": "model.ckpt", + "disp_training": true, + "time_training": true, + "profiling": false, + "profiling_file": "timeline.json", + + "_comment": "that's all" +} + From c31b2835f677094431b3a630cd93c889e2d41f64 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 01:22:26 +0800 Subject: [PATCH 05/23] Fix bugs in DPA-1 when trying to compress other model --- deepmd/train/trainer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepmd/train/trainer.py b/deepmd/train/trainer.py index b26e0b1550..f1c6c852a1 100644 --- a/deepmd/train/trainer.py +++ b/deepmd/train/trainer.py @@ -288,7 +288,8 @@ def build (self, stop_batch = 0) : self.ntypes = self.model.get_ntypes() self.stop_batch = stop_batch - if data.large_batch_mode: + + if not self.is_compress and data.large_batch_mode: assert self.descrpt_type in ['se_atten'], 'Data in large_batch_mode must use attention descriptor!' assert self.fitting_type in ['ener'], 'Data in large_batch_mode must use ener fitting!' From c5d9d68632637880a356536b1c931742e5ed0cd3 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 12:45:54 +0800 Subject: [PATCH 06/23] Add layernorm support for tf early version --- deepmd/descriptor/se_atten.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/deepmd/descriptor/se_atten.py b/deepmd/descriptor/se_atten.py index 218635ce68..22dc022de2 100644 --- a/deepmd/descriptor/se_atten.py +++ b/deepmd/descriptor/se_atten.py @@ -1,10 +1,12 @@ import math import numpy as np from typing import Tuple, List, Dict, Any +from packaging.version import Version from deepmd.env import tf from deepmd.common import get_activation_func, get_precision, cast_precision from deepmd.env import GLOBAL_TF_FLOAT_PRECISION +from deepmd.env import TF_VERSION from deepmd.env import GLOBAL_NP_FLOAT_PRECISION from deepmd.env import op_module from deepmd.env import default_tf_session_config @@ -508,7 +510,10 @@ def _feedforward(self, input_xyz, d_in, d_mid): trainable=True, uniform_seed=self.uniform_seed) input_xyz += residual - input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) + if Version(TF_VERSION) < Version('2'): + input_xyz = tf.contrib.layers.layer_norm(input_xyz) + else: + input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) return input_xyz def _scaled_dot_attn(self, Q, K, V, temperature, input_r, dotr=False, do_mask=False, layer=0, save_weights=True): @@ -609,8 +614,10 @@ def _attention_layers( precision=self.filter_precision, trainable=trainable, uniform_seed=self.uniform_seed) - # natom x nei_type_i x out_size - input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) + if Version(TF_VERSION) < Version('2'): + input_xyz = tf.contrib.layers.layer_norm(input_xyz) + else: + input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) # input_xyz = self._feedforward(input_xyz, outputs_size[-1], self.att_n) return input_xyz From b66c2fff8f43d5ef2f28a1d0a86eacf44b31715e Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 14:51:47 +0800 Subject: [PATCH 07/23] Upload the model image --- doc/images/model_se_atten.png | Bin 0 -> 307524 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/model_se_atten.png diff --git a/doc/images/model_se_atten.png b/doc/images/model_se_atten.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a247be30cf41db6930c14eb8289c2e89e31511 GIT binary patch literal 307524 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

=IJ4%qXsf2CRmL&$Z8iBVtMTsB|( zZJ0y9);Z#9(~fo8N=Fg<(N{{)XHzu)s^^%;A-ZfZr419{HW~@&PZju7re)%>Jmwkl z;}x$@8)z4C#hrdx%v6T8IyAZZ9Wv3WKmDPZ+$1FMA^1aqfLprH{QwY=r}D)&$@Gfez)V^`V}q#tz8|Ui^f^4M@HWpo6Am@ z+66vQ#)pGNk+vcy%_@ymqE1^q#C zpmdBB8l{Qo(&oe)oN?^G`Yw6}F8>mZKV=)dsc4D_Ar@jhyxs-B&z3V$FGP1`9)cv{ zOFC*}yLxv9VPW|D9nF=PEOAeL<75(NHK{kPw(|YY)6M<2Els`y<-j{o^0!)%eQ&so zw%GG?2P$CcEfMH6Xcs;cg~0Js&k@C2w$_M^gLT0!u9uGoO_Lp!JG&Hca;l9_O~R0bP!=B| zd)j8C5|MEO*lL=-+$t7{?}oJqf8zTqo)r90{}jl%w{J zhwCfoIx((_i?=jrC=+EFoh&s!2Mi4ubGL4Q;>VIs<&?y}{yC-7_zqpJ4U*G;(`*S3 z_`x5t4q?h<&1N_8_Q1=%TADUX$oH=Qu}XhX^SyhX=JrTskc1^eV#vJbl}l9=)mSj2 zaToGXI|gcDm~QgzrTUm6=Jl60bhhc9SZHeE?OG|eiyHhvpQ{#oWtJ8Uh&a|xNjyY2 zY3?P+6zW}OnhMzCk8ODJ>g@|$^_!dKYf}$A>4TSbw;25ZiK3*y|KL`2*)eTRyT_&} zdesX8g7>xhiq^ZxbWC77E2f5kuXr=@@>M}c&}Kvh?2+2^h;l~~RBarj<`}?0>RMX| zEnxB@MnK#UM|Wz5YLIi?#e6^L+}n6l0S4sFAwk;VB}GEfpmZrFC$8HNFa0yN_Sa$y zcM@&{8XY0@@j`3^Pd2FaDRMY85|qWnBN5g2#lYSVHNJeC%zfYC(S3l9fzGws@4?YR zZrQ(=__RPlBxwwL6ZUSM65n?83}cN9PKXD8sSNf>eI~p&`Ga~2kf_7}J$VpS>b51w ziOdQ#Uj6Ib^Q9?W%S-=j0?E!#pOuWoLZ|caqvQK{D0;Pk$ zv8iV{5_nJKj|51LS4AB%M&xp1#KXk&-g4~S^$k<$7ttt6Xm}1Q!%G5@mq`NvFHw(Q z#H+2R+7FsY*ixWHCmINl4M%-x-g~psLWw-OH4+sYx1TUF*-=+es3_CyQuRK3SzFZR z9u%@cRgKAp;!H!zQ$Q1w5<1QvP~ZqxyX4y{${Y{VK|^s3CToct1&odpIT{mGwdu6__OI13P{N?I|3t7!-k%bs(}Pi+ zv)94|-8nUk@G8ZRn$JaE5l$!GxxNZ$2yDM)hS2R!A}ms9QER-Bg$9VL(%ch2JMKp- z>xAawPIp>tA@?S_S52O3t;LyC3r$`ZKTP}$f41ps=%ZvzTjvChCHnmF6`SId3agsI zAliHDf7{=bR2JDLu5@Xt*PT?VnfHJWH}?0qHeKTjIU4|NM4o5L2URCly`tD zr^>Txspj8m`e=@(5gHivUbZ|$qu8Q4&h@`Az5-^=;1;P>-6OuJK6fJ(6x<@5Sq=qN z35CK7c1QVMF_7dJYJO2A+*P7!>EhJ{g;3SMV4>am&c}L}b%o?(+-l5@&sk@AmY*aa zyr6?JbJ|;6Q*{WYLGrPGK>xiHI zd$w;#f!c1ngPl;Qx8K&PG)|b5?pF41)S)m0j1-;s{2sHC%)h_-EP%VA1g3%h4F)p< zP@hGYp|5i!!Rt;S%d~}pIC7yt(cMwaVwMtj_eaRXAvyGO!5KnlAQ_rT4$N!iAsu@N zgjhM$h^ZUpEkDBi*tLP7G}~Bt!7rAheLB5bl>QpY zoqxLdv|85C*L!t(8{i@+sah)Yp0iuewAv0o(Z3=2MPj1PxyR>R>OG+7OAw{%HgA%5|yH_osK?@ri??-aB(K;hraIt4usl;x8 z#vysJ`-KV03po$LXbpKfuDSXOS6tV9YxolEXfxQLZV*>(MyxJy^tL5`lkP(3gkDay zzZOcx3N&K33R(G;4BFoqeXv2;4fywZ|$=E11i<`z)=s%rgHps zj+LC6%6%@qyJPr8#x#^1h39*!E%8q?`es@1zkBXUj~`U(pK+fLKvdU#n zQd$OsU5+Sd`B54uWGMoodC&SIKnNTy)v-9%K3gNOL%O&AP>TI-wu3qXq)d*0WO4}) ztM=kYl^-MArB5p3dp!Abe~t}j+42GK66WWsBQBJ5w|De5eF5=~kfp|jN355R!hxt< z9AOCgQ%q}*N{oNd{EDE{FQjN< z!kO9t_aM+BtXB#II2f)pC zdO9pF!ceVlAatEeQclpFZ~H79gG^E_V8YjPqKy_;IlKFA%N6hSN|R;cS!Yoj(ss#! zfx_2GPT}u3i*(Cg6H@joC*A7hS8J7gTgD)l#bY Il&N?}PA@JU5kVCM-Q(Q4snO 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 U#u9Ster-j*+x)$+c Date: Sat, 20 Aug 2022 15:58:57 +0800 Subject: [PATCH 08/23] Create train-se-atten.md --- doc/model/train-se-atten.md | 107 ++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 doc/model/train-se-atten.md diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md new file mode 100644 index 0000000000..7cdc8f780e --- /dev/null +++ b/doc/model/train-se-atten.md @@ -0,0 +1,107 @@ +# DPA-1: Pretraining of Attention-based Deep Potential Model for Molecular Simulation + +![ALT](../images/model_se_atten.png "model_se_atten") + +Here we propose DPA-1, a Deep Potential model with a novel attention mechanism, which is highly effective for representing the conformation and chemical spaces of atomic systems and learning the PES. + +See [this paper](https://arxiv.org/abs/2208.08236) for more information. DPA-1 is implemented as a new descriptor `"se_atten"` for model training, which can be used after simply editing the input.json. + +# Installation +DPA-1 will be merged into DeePMD-kit official repo: [github](https://github.com/deepmodeling/deepmd-kit), and before that, for early adopters, you can refer to the following steps for a quick start: + +Get the DeePMD-kit source code by `git clone` from a temporary repo: +```bash +cd /some/workspace +git clone --recursive https://github.com/iProzd/deepmd-kit.git deepmd-kit +``` +The `--recursive` option clones all [submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) needed by DeePMD-kit. + +For convenience, you may want to record the location of source to a variable, saying `deepmd_source_dir` by +```bash +cd deepmd-kit +deepmd_source_dir=`pwd` +``` + +Then you can refer to [standard installation](../install/install-from-source.md#install-the-python-interface) of python interface in DeePMD-kit. After that, you can smoothly use the DPA-1 model with following instructions. + +# Introduction to new features of DPA-1 +Next we will list the detail settings in input.json and the data format, especially for large systems with dozens of elements. An example of DPA-1 input can be found in [here](../../examples/water/se_atten/input.json). + +## Descriptor `"se_atten"` + +The notation of `se_atten` is short for the Deep Potential Smooth Edition with an Attention Mechanism and Type Embedding. The `e2` stands for the embedding with two-atoms information. +This descriptor was described in detail in [the DPA-1 paper](https://arxiv.org/abs/2208.08236) and the images above. + +In this example we will train a DPA-1 model for a water system. A complete training input script of this example can be find in the directory. +```bash +$deepmd_source_dir/examples/water/se_atten/input.json +``` +With the training input script, data are also provided in the example directory. One may train the model with the DeePMD-kit from the directory. + +An example of the descriptor is provided as follows +```json + "descriptor" :{ + "type": "se_atten", + "rcut_smth": 0.50, + "rcut": 6.00, + "sel": 120, + "neuron": [25, 50, 100], + "type_one_side": true, + "axis_neuron": 16, + "resnet_dt": false, + "attn": 128, + "attn_layer": 2, + "attn_mask": false, + "attn_dotr": true, + "seed": 1 + } +``` +* The {ref}`type ` of the descriptor is set to `"se_atten"`, which will use DPA-1 structures. +* {ref}`rcut ` is the cut-off radius for neighbor searching, and the {ref}`rcut_smth ` gives where the smoothing starts. +* **{ref}`sel `** gives the maximum possible number of neighbors in the cut-off radius. It is an int. Note that this number highly effects the efficiency of training, which we usually use less than 200. (We use 120 for training 56 elements in [OC2M dataset](https://github.com/Open-Catalyst-Project/ocp/blob/main/DATASET.md)) +* The {ref}`neuron ` specifies the size of the embedding net. From left to right the members denote the sizes of each hidden layer from input end to the output end, respectively. If the outer layer is of twice size as the inner layer, then the inner layer is copied and concatenated, then a [ResNet architecture](https://arxiv.org/abs/1512.03385) is built between them. +* If the option {ref}`type_one_side ` is set to `true`, then descriptor will consider the types of neighbor atoms. Otherwise, both the types of centric and  neighbor atoms are considered. +* The {ref}`axis_neuron ` specifies the size of submatrix of the embedding matrix, the axis matrix as explained in the [DeepPot-SE paper](https://arxiv.org/abs/1805.09003) +* If the option {ref}`resnet_dt ` is set to `true`, then a timestep is used in the ResNet. +* {ref}`seed ` gives the random seed that is used to generate random numbers when initializing the model parameters. +* {ref}`attn ` sets the length of hidden vector during scale-dot attention computation. +* {ref}`attn_layer ` sets the number of layers in attention mechanism. +* {ref}`attn_mask ` determines whether to mask the diagonal in the attention weights and False is recommended. +* {ref}`attn_dotr ` determines whether to dot the relative coordinates on the attention weights as a gated scheme, True is recommended. + +## Fitting `"ener"` +DPA-1 only support `"ener"` fitting type, and you can refer [here](train-energy.md) for detail information. + +## Type embedding +DPA-1 only support models with type embeddings on. And the default setting is as follows: +```json +"type_embedding":{ + "neuron": [2, 4, 8], + "resnet_dt": false, + "seed": 1 + }, +``` +You can add these settings in input.json if you want to change the defaul ones, see [here](train-se-e2-a-tebd.md) for detail information. + + +## Type map +For training a large systems, especially those with dozens of elements, the {ref}`type ` determines the element index of training data: +```json +"type_map": [ + "Mg", + "Al", + "Cu" + ] +``` +which should include all the elements in the dataset you want to train on. The detail of data format can be found in [here](data/data-conv.md). +Note that this data format requires that, only those frames with the same fingerprint(i.e. the number of atoms of different element) can be put together as a unit system. +This may lead to sparse frame number in those rare systems. + +An ideal way is to put systems with same total number of atoms together, which is the way we trained DPA-1 on OC2M. This API will be uploaded on dpdata soon for a more convenient experience. + + + + + + + From 7854dd4a6d65d3c3513036fe5763e5283ceb5d1f Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 16:08:06 +0800 Subject: [PATCH 09/23] Update the download links of DPA-1 example --- doc/model/train-se-atten.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md index 7cdc8f780e..cb9b6bb575 100644 --- a/doc/model/train-se-atten.md +++ b/doc/model/train-se-atten.md @@ -99,7 +99,10 @@ This may lead to sparse frame number in those rare systems. An ideal way is to put systems with same total number of atoms together, which is the way we trained DPA-1 on OC2M. This API will be uploaded on dpdata soon for a more convenient experience. - +# Training example +Here we upload the AlMgCu example showed in the paper, you can download here: +[Baidu disk](https://pan.baidu.com/s/1Ip0_UZHi8ZM_KMnvGKmxKg?pwd=zurf); +[Google disk](https://drive.google.com/file/d/1AjiXLWeytrkpz1y9QQrPQERStVnkHpTd/view?usp=sharing). From 055401e287e028a91546607293605ce55bb9554c Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 16:14:46 +0800 Subject: [PATCH 10/23] Update train-se-atten.md --- doc/model/train-se-atten.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md index cb9b6bb575..a9df1de026 100644 --- a/doc/model/train-se-atten.md +++ b/doc/model/train-se-atten.md @@ -46,7 +46,6 @@ An example of the descriptor is provided as follows "rcut": 6.00, "sel": 120, "neuron": [25, 50, 100], - "type_one_side": true, "axis_neuron": 16, "resnet_dt": false, "attn": 128, @@ -60,7 +59,6 @@ An example of the descriptor is provided as follows * {ref}`rcut ` is the cut-off radius for neighbor searching, and the {ref}`rcut_smth ` gives where the smoothing starts. * **{ref}`sel `** gives the maximum possible number of neighbors in the cut-off radius. It is an int. Note that this number highly effects the efficiency of training, which we usually use less than 200. (We use 120 for training 56 elements in [OC2M dataset](https://github.com/Open-Catalyst-Project/ocp/blob/main/DATASET.md)) * The {ref}`neuron ` specifies the size of the embedding net. From left to right the members denote the sizes of each hidden layer from input end to the output end, respectively. If the outer layer is of twice size as the inner layer, then the inner layer is copied and concatenated, then a [ResNet architecture](https://arxiv.org/abs/1512.03385) is built between them. -* If the option {ref}`type_one_side ` is set to `true`, then descriptor will consider the types of neighbor atoms. Otherwise, both the types of centric and  neighbor atoms are considered. * The {ref}`axis_neuron ` specifies the size of submatrix of the embedding matrix, the axis matrix as explained in the [DeepPot-SE paper](https://arxiv.org/abs/1805.09003) * If the option {ref}`resnet_dt ` is set to `true`, then a timestep is used in the ResNet. * {ref}`seed ` gives the random seed that is used to generate random numbers when initializing the model parameters. From 3961e0d94ad51cd775464ca966894e03eb61b4d6 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 16:17:21 +0800 Subject: [PATCH 11/23] Update train-se-atten.md --- doc/model/train-se-atten.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md index a9df1de026..997352dba5 100644 --- a/doc/model/train-se-atten.md +++ b/doc/model/train-se-atten.md @@ -16,9 +16,10 @@ git clone --recursive https://github.com/iProzd/deepmd-kit.git deepmd-kit ``` The `--recursive` option clones all [submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) needed by DeePMD-kit. -For convenience, you may want to record the location of source to a variable, saying `deepmd_source_dir` by +Note that, you **must change to the devel branch** for further installation**. And for convenience, you may want to record the location of source to a variable, saying `deepmd_source_dir` by ```bash cd deepmd-kit +git checkout devel deepmd_source_dir=`pwd` ``` From f04567fae4f77a27cd66aaaedc8e736695d07687 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 16:17:56 +0800 Subject: [PATCH 12/23] Update train-se-atten.md --- doc/model/train-se-atten.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md index 997352dba5..bc230630d8 100644 --- a/doc/model/train-se-atten.md +++ b/doc/model/train-se-atten.md @@ -16,7 +16,7 @@ git clone --recursive https://github.com/iProzd/deepmd-kit.git deepmd-kit ``` The `--recursive` option clones all [submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) needed by DeePMD-kit. -Note that, you **must change to the devel branch** for further installation**. And for convenience, you may want to record the location of source to a variable, saying `deepmd_source_dir` by +Note that, you **must change to the devel branch** for further installation. And for convenience, you may want to record the location of source to a variable, saying `deepmd_source_dir` by ```bash cd deepmd-kit git checkout devel From c0247c13d7e20767f32a64108f84805a95e7e802 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Sat, 20 Aug 2022 22:44:10 +0800 Subject: [PATCH 13/23] Update train-se-atten.md --- doc/model/train-se-atten.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md index bc230630d8..1e7ef60fcb 100644 --- a/doc/model/train-se-atten.md +++ b/doc/model/train-se-atten.md @@ -100,8 +100,8 @@ An ideal way is to put systems with same total number of atoms together, which i # Training example Here we upload the AlMgCu example showed in the paper, you can download here: -[Baidu disk](https://pan.baidu.com/s/1Ip0_UZHi8ZM_KMnvGKmxKg?pwd=zurf); -[Google disk](https://drive.google.com/file/d/1AjiXLWeytrkpz1y9QQrPQERStVnkHpTd/view?usp=sharing). +[Baidu disk](https://pan.baidu.com/s/1Mk9CihPHCmf8quwaMhT-nA?pwd=d586); +[Google disk](https://drive.google.com/file/d/11baEpRrvHoqxORFPSdJiGWusb3Y4AnRE/view?usp=sharing). From 087b4647b8ec4eec83034dbca6f6afb1d3c936f9 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Tue, 23 Aug 2022 23:51:16 +0800 Subject: [PATCH 14/23] Deal with the required changes Deal with the required changes, add docs, and fix bugs in UT. --- deepmd/descriptor/se_atten.py | 46 ++--- deepmd/fit/ener.py | 25 +-- deepmd/model/ener.py | 16 +- deepmd/train/trainer.py | 13 +- deepmd/utils/data.py | 11 +- deepmd/utils/data_system.py | 8 +- deepmd/utils/network.py | 5 +- deepmd/utils/type_embed.py | 43 ++--- doc/data/data-conv.md | 2 + doc/data/system.md | 2 +- doc/images/model_se_atten.png | Bin 307524 -> 99657 bytes doc/model/train-se-atten.md | 63 ++++--- source/lib/include/prod_env_mat.h | 70 +------ source/lib/src/cuda/prod_env_mat.cu | 54 +----- source/lib/src/prod_env_mat.cc | 174 ++---------------- source/lib/src/rocm/prod_env_mat.hip.cu | 54 +----- source/lib/tests/test_env_mat_a_mix.cc | 38 ++-- source/op/prod_env_mat_multi_device.cc | 12 +- source/tests/common.py | 167 +++++++++-------- source/tests/test_data_large_batch.py | 18 +- source/tests/test_descrpt_se_atten.py | 20 +- source/tests/test_examples.py | 1 + source/tests/test_fitting_ener_type.py | 9 +- source/tests/test_model_se_atten.py | 6 +- source/tests/water_se_atten.json | 2 +- ...ch.json => water_se_atten_mixed_type.json} | 4 +- 26 files changed, 310 insertions(+), 553 deletions(-) rename source/tests/{water_se_atten_large_batch.json => water_se_atten_mixed_type.json} (95%) diff --git a/deepmd/descriptor/se_atten.py b/deepmd/descriptor/se_atten.py index 22dc022de2..8e91062e0c 100644 --- a/deepmd/descriptor/se_atten.py +++ b/deepmd/descriptor/se_atten.py @@ -55,6 +55,14 @@ class DescrptSeAtten(DescrptSeA): The precision of the embedding net parameters. Supported options are |PRECISION| uniform_seed Only for the purpose of backward compatibility, retrieves the old behavior of using the random seed + attn + The length of hidden vector during scale-dot attention computation. + attn_layer + The number of layers in attention mechanism. + attn_dotr + Whether to dot the relative coordinates on the attention weights as a gated scheme. + attn_mask + Whether to mask the diagonal in the attention weights. """ def __init__(self, @@ -75,7 +83,7 @@ def __init__(self, uniform_seed: bool = False, attn: int = 128, attn_layer: int = 2, - attn_dotr: bool = False, + attn_dotr: bool = True, attn_mask: bool = False ) -> None: DescrptSeA.__init__(self, @@ -97,6 +105,7 @@ def __init__(self, """ Constructor """ + assert (Version(TF_VERSION) > Version('2')), "se_atten only support tensorflow version 2.0 or higher." self.ntypes = ntypes self.att_n = attn self.attn_layer = attn_layer @@ -139,7 +148,7 @@ def compute_input_stats(self, natoms_vec: list, mesh: list, input_dict: dict, - large_batch_mode: bool = False, + mixed_type: bool = False, real_natoms_vec: list = None ) -> None: """ @@ -155,16 +164,17 @@ def compute_input_stats(self, The atom types. Can be generated by deepmd.model.make_stat_input natoms_vec The vector for the number of atoms of the system and different types of atoms. - If large_batch_mode is True, this para is blank. See real_natoms_vec. + If mixed_type is True, this para is blank. See real_natoms_vec. mesh The mesh for neighbor searching. Can be generated by deepmd.model.make_stat_input input_dict Dictionary for additional input - large_batch_mode - Perform the large batch mode or not. - If True, it means that a new system contains data from different systems originally with same nloc. + mixed_type + Whether to perform the mixed_type mode. + If True, the input data has the mixed_type format (see doc/model/train_se_atten.md), + in which frames in a system may have different natoms_vec(s), with the same nloc. real_natoms_vec - If large_batch_mode is True, it takes in the real natoms_vec. + If mixed_type is True, it takes in the real natoms_vec for each frame. """ all_davg = [] all_dstd = [] @@ -174,11 +184,11 @@ def compute_input_stats(self, sumn = [] sumr2 = [] suma2 = [] - if large_batch_mode: + if mixed_type: sys_num = 0 for cc, bb, tt, nn, mm, r_n in zip(data_coord, data_box, data_atype, natoms_vec, mesh, real_natoms_vec): sysr, sysr2, sysa, sysa2, sysn \ - = self._compute_dstats_sys_smth(cc, bb, tt, nn, mm, large_batch_mode, r_n) + = self._compute_dstats_sys_smth(cc, bb, tt, nn, mm, mixed_type, r_n) sys_num += 1 sumr.append(sysr) suma.append(sysa) @@ -315,7 +325,7 @@ def build(self, sel_r=self.sel_all_r) self.nei_type_vec = tf.reshape(self.nei_type_vec, [-1]) self.nmask = tf.reshape(self.nmask, [-1, 1, self.sel_all_a[0]]) - self.negtive_mask = -(2 << 32) * (1.0 - self.nmask) + self.negative_mask = -(2 << 32) * (1.0 - self.nmask) # only used when tensorboard was set as true tf.summary.histogram('descrpt', self.descrpt) tf.summary.histogram('rij', self.rij) @@ -372,7 +382,7 @@ def _compute_dstats_sys_smth(self, data_atype, natoms_vec, mesh, - large_batch_mode=False, + mixed_type=False, real_natoms_vec=None): dd_all, descrpt_deriv_t, rij_t, nlist_t, nei_type_vec_t, nmask_t \ = run_sess(self.sub_sess, [self.stat_descrpt, self.descrpt_deriv_t, self.rij_t, self.nlist_t, self.nei_type_vec_t, self.nmask_t], @@ -383,7 +393,7 @@ def _compute_dstats_sys_smth(self, self.place_holders['box']: data_box, self.place_holders['default_mesh']: mesh, }) - if large_batch_mode: + if mixed_type: nframes = dd_all.shape[0] sysr = [0. for i in range(self.ntypes)] sysa = [0. for i in range(self.ntypes)] @@ -510,16 +520,13 @@ def _feedforward(self, input_xyz, d_in, d_mid): trainable=True, uniform_seed=self.uniform_seed) input_xyz += residual - if Version(TF_VERSION) < Version('2'): - input_xyz = tf.contrib.layers.layer_norm(input_xyz) - else: - input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) + input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) return input_xyz def _scaled_dot_attn(self, Q, K, V, temperature, input_r, dotr=False, do_mask=False, layer=0, save_weights=True): attn = tf.matmul(Q / temperature, K, transpose_b=True) attn *= self.nmask - attn += self.negtive_mask + attn += self.negative_mask attn = tf.nn.softmax(attn, axis=-1) attn *= tf.reshape(self.nmask, [-1, attn.shape[-1], 1]) if save_weights: @@ -614,10 +621,7 @@ def _attention_layers( precision=self.filter_precision, trainable=trainable, uniform_seed=self.uniform_seed) - if Version(TF_VERSION) < Version('2'): - input_xyz = tf.contrib.layers.layer_norm(input_xyz) - else: - input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) + input_xyz = tf.keras.layers.LayerNormalization()(input_xyz) # input_xyz = self._feedforward(input_xyz, outputs_size[-1], self.att_n) return input_xyz diff --git a/deepmd/fit/ener.py b/deepmd/fit/ener.py index 4dd063a02e..876af78493 100644 --- a/deepmd/fit/ener.py +++ b/deepmd/fit/ener.py @@ -169,7 +169,7 @@ def get_numb_aparam(self) -> int: def compute_output_stats(self, all_stat: dict, - large_batch_mode: bool = False + mixed_type: bool = False ) -> None: """ Compute the ouput statistics @@ -180,10 +180,14 @@ def compute_output_stats(self, must have the following components: all_stat['energy'] of shape n_sys x n_batch x n_frame can be prepared by model.make_stat_input + mixed_type + Whether to perform the mixed_type mode. + If True, the input data has the mixed_type format (see doc/model/train_se_atten.md), + in which frames in a system may have different natoms_vec(s), with the same nloc. """ - self.bias_atom_e = self._compute_output_stats(all_stat, rcond=self.rcond, large_batch_mode=large_batch_mode) + self.bias_atom_e = self._compute_output_stats(all_stat, rcond=self.rcond, mixed_type=mixed_type) - def _compute_output_stats(self, all_stat, rcond=1e-3, large_batch_mode=False): + def _compute_output_stats(self, all_stat, rcond=1e-3, mixed_type=False): data = all_stat['energy'] # data[sys_idx][batch_idx][frame_idx] sys_ener = np.array([]) @@ -195,7 +199,7 @@ def _compute_output_stats(self, all_stat, rcond=1e-3, large_batch_mode=False): sys_data = np.concatenate(sys_data) sys_ener = np.append(sys_ener, np.average(sys_data)) sys_tynatom = np.array([]) - if large_batch_mode: + if mixed_type: data = all_stat['real_natoms_vec'] nsys = len(data) for ss in range(len(data)): @@ -396,11 +400,6 @@ def build (self, if input_dict is None: input_dict = {} bias_atom_e = self.bias_atom_e - self.bias_atom_e_t = tf.get_variable('t_bias_atom_e', - self.bias_atom_e.shape, - dtype=GLOBAL_TF_FLOAT_PRECISION, - trainable=False, - initializer=tf.constant_initializer(self.bias_atom_e)) if self.numb_fparam > 0: if self.fparam_avg is None: self.fparam_avg = 0. @@ -419,6 +418,11 @@ def build (self, t_daparam = tf.constant(self.numb_aparam, name = 'daparam', dtype = tf.int32) + self.t_bias_atom_e = tf.get_variable('t_bias_atom_e', + self.bias_atom_e.shape, + dtype=GLOBAL_TF_FLOAT_PRECISION, + trainable=False, + initializer=tf.constant_initializer(self.bias_atom_e)) if self.numb_fparam > 0: t_fparam_avg = tf.get_variable('t_fparam_avg', self.numb_fparam, @@ -516,7 +520,6 @@ def build (self, [tf.reshape(inputs,[-1,self.dim_descrpt]),atype_embed], axis=1 ) - self.tmp_input = inputs self.dim_descrpt = self.dim_descrpt + type_shape[1] inputs = tf.reshape(inputs, [-1, natoms[0], self.dim_descrpt]) final_layer = self._build_lower( @@ -527,7 +530,7 @@ def build (self, outs = tf.reshape(final_layer, [tf.shape(inputs)[0], natoms[0]]) # add bias self.atom_ener_before = outs - self.add_type = tf.reshape(tf.nn.embedding_lookup(self.bias_atom_e_t, self.atype_nloc), [tf.shape(inputs)[0], natoms[0]]) + self.add_type = tf.reshape(tf.nn.embedding_lookup(self.t_bias_atom_e, self.atype_nloc), [tf.shape(inputs)[0], natoms[0]]) outs = outs + self.add_type self.atom_ener_after = outs diff --git a/deepmd/model/ener.py b/deepmd/model/ener.py index 17fde2064c..7504e22906 100644 --- a/deepmd/model/ener.py +++ b/deepmd/model/ener.py @@ -92,19 +92,19 @@ def get_type_map (self) : def data_stat(self, data): all_stat = make_stat_input(data, self.data_stat_nbatch, merge_sys = False) m_all_stat = merge_sys_stat(all_stat) - self._compute_input_stat(m_all_stat, protection=self.data_stat_protect, large_batch_mode=data.large_batch_mode) - self._compute_output_stat(all_stat, large_batch_mode=data.large_batch_mode) + self._compute_input_stat(m_all_stat, protection=self.data_stat_protect, mixed_type=data.mixed_type) + self._compute_output_stat(all_stat, mixed_type=data.mixed_type) # self.bias_atom_e = data.compute_energy_shift(self.rcond) - def _compute_input_stat (self, all_stat, protection=1e-2, large_batch_mode=False): - if large_batch_mode: + def _compute_input_stat (self, all_stat, protection=1e-2, mixed_type=False): + if mixed_type: self.descrpt.compute_input_stats(all_stat['coord'], all_stat['box'], all_stat['type'], all_stat['natoms_vec'], all_stat['default_mesh'], all_stat, - large_batch_mode, + mixed_type, all_stat['real_natoms_vec']) else: self.descrpt.compute_input_stats(all_stat['coord'], @@ -115,9 +115,9 @@ def _compute_input_stat (self, all_stat, protection=1e-2, large_batch_mode=False all_stat) self.fitting.compute_input_stats(all_stat, protection=protection) - def _compute_output_stat (self, all_stat, large_batch_mode=False): - if large_batch_mode: - self.fitting.compute_output_stats(all_stat, large_batch_mode=large_batch_mode) + def _compute_output_stat (self, all_stat, mixed_type=False): + if mixed_type: + self.fitting.compute_output_stats(all_stat, mixed_type=mixed_type) else: self.fitting.compute_output_stats(all_stat) diff --git a/deepmd/train/trainer.py b/deepmd/train/trainer.py index f1c6c852a1..a3ef294373 100644 --- a/deepmd/train/trainer.py +++ b/deepmd/train/trainer.py @@ -115,10 +115,8 @@ def _init_param(self, jdata): raise RuntimeError('unknow fitting type ' + fitting_type) # type embedding - use_linear = False padding = False if descrpt_type == 'se_atten': - use_linear = True padding = True if typeebd_param is not None: self.typeebd = TypeEmbedNet( @@ -128,14 +126,13 @@ def _init_param(self, jdata): precision=typeebd_param['precision'], trainable=typeebd_param['trainable'], seed=typeebd_param['seed'], - use_linear=use_linear, padding=padding ) elif descrpt_type == 'se_atten': self.typeebd = TypeEmbedNet( - neuron=[2, 4, 8], + neuron=[8], + activation_function=None, seed=1, - use_linear=use_linear, padding=padding ) else: @@ -289,9 +286,9 @@ def build (self, self.ntypes = self.model.get_ntypes() self.stop_batch = stop_batch - if not self.is_compress and data.large_batch_mode: - assert self.descrpt_type in ['se_atten'], 'Data in large_batch_mode must use attention descriptor!' - assert self.fitting_type in ['ener'], 'Data in large_batch_mode must use ener fitting!' + if not self.is_compress and data.mixed_type: + assert self.descrpt_type in ['se_atten'], 'Data in mixed_type format must use attention descriptor!' + assert self.fitting_type in ['ener'], 'Data in mixed_type format must use ener fitting!' if self.numb_fparam > 0 : log.info("training with %d frame parameter(s)" % self.numb_fparam) diff --git a/deepmd/utils/data.py b/deepmd/utils/data.py index 655e8bdb78..b87d53813d 100644 --- a/deepmd/utils/data.py +++ b/deepmd/utils/data.py @@ -48,7 +48,7 @@ def __init__ (self, root = DPPath(sys_path) self.dirs = root.glob(set_prefix + ".*") self.dirs.sort() - self.large_batch_mode = self._check_mode(sys_path) + self.mixed_type = self._check_mode(self.dirs[0]) # mixed_type format only has one set # load atom type self.atom_type = self._load_type(root) self.natoms = len(self.atom_type) @@ -452,7 +452,7 @@ def _load_set(self, set_name: DPPath) : tmp_in = data[k_in].astype(GLOBAL_ENER_FLOAT_PRECISION) data[kk] = np.sum(np.reshape(tmp_in, [nframes, self.natoms, ndof]), axis = 1) - if self.large_batch_mode: + if self.mixed_type: type_path = set_name / "real_atom_types.npy" data['type'] = type_path.load_numpy().astype(np.int32).reshape([nframes, -1]) natoms = data['type'].shape[1] @@ -534,11 +534,8 @@ def _check_pbc(self, sys_path: DPPath): pbc = False return pbc - def _check_mode(self, sys_path): - large_batch_mode = False - if os.path.isfile(os.path.join(sys_path, 'set.000', 'real_atom_types.npy')): - large_batch_mode = True - return large_batch_mode + def _check_mode(self, set_path: DPPath): + return (set_path / 'real_atom_types.npy').is_file() class DataSets (object): diff --git a/deepmd/utils/data_system.py b/deepmd/utils/data_system.py index 98969c5d9b..15eb6f91fc 100644 --- a/deepmd/utils/data_system.py +++ b/deepmd/utils/data_system.py @@ -10,6 +10,7 @@ from deepmd.utils import random as dp_random from deepmd.utils.data import DataSets from deepmd.utils.data import DeepmdData +from IPython import embed log = logging.getLogger(__name__) @@ -84,7 +85,12 @@ def __init__ (self, modifier = modifier, trn_all_set = trn_all_set )) - self.large_batch_mode = self.data_systems[0].large_batch_mode + if self.data_systems[0].mixed_type: + for data_sys in self.data_systems[1:]: + assert data_sys.mixed_type, "all systems must have the same format for mixed_type!" + self.mixed_type = True + else: + self.mixed_type = False # batch size self.batch_size = batch_size if isinstance(self.batch_size, int): diff --git a/deepmd/utils/network.py b/deepmd/utils/network.py index befd571f24..20a9070039 100644 --- a/deepmd/utils/network.py +++ b/deepmd/utils/network.py @@ -204,7 +204,10 @@ def embedding_net(xx, xx = tf.cast(xx, get_precision(mixed_prec['compute_prec'])) w = tf.cast(w, get_precision(mixed_prec['compute_prec'])) b = tf.cast(b, get_precision(mixed_prec['compute_prec'])) - hidden = tf.reshape(activation_fn(tf.nn.bias_add(tf.matmul(xx, w), b)), [-1, outputs_size[ii]]) + if activation_fn != None: + hidden = tf.reshape(activation_fn(tf.nn.bias_add(tf.matmul(xx, w), b)), [-1, outputs_size[ii]]) + else: + hidden = tf.reshape(tf.nn.bias_add(tf.matmul(xx, w), b), [-1, outputs_size[ii]]) if resnet_dt : idt_initializer = tf.random_normal_initializer( stddev=0.001, diff --git a/deepmd/utils/type_embed.py b/deepmd/utils/type_embed.py index 583c9b85d5..82bb72ec57 100644 --- a/deepmd/utils/type_embed.py +++ b/deepmd/utils/type_embed.py @@ -72,17 +72,18 @@ class TypeEmbedNet(): Random seed for initializing the network parameters. uniform_seed Only for the purpose of backward compatibility, retrieves the old behavior of using the random seed + padding + Concat the zero padding to the output, as the default embedding of empty type. """ def __init__( self, neuron: List[int]=[], resnet_dt: bool = False, - activation_function: str = 'tanh', + activation_function='tanh', precision: str = 'default', trainable: bool = True, seed: int = None, uniform_seed: bool = False, - use_linear: bool = False, padding: bool = False, )->None: """ @@ -92,11 +93,13 @@ def __init__( self.seed = seed self.filter_resnet_dt = resnet_dt self.filter_precision = get_precision(precision) - self.filter_activation_fn = get_activation_func(activation_function) + if activation_function is not None: + self.filter_activation_fn = get_activation_func(activation_function) + else: + self.filter_activation_fn = None self.trainable = trainable self.uniform_seed = uniform_seed self.type_embedding_net_variables = None - self.use_linear = use_linear self.padding = padding @@ -130,33 +133,21 @@ def build( ebd_type = tf.cast(tf.one_hot(tf.cast(types,dtype=tf.int32),int(ntypes)), self.filter_precision) ebd_type = tf.reshape(ebd_type, [-1, ntypes]) name = 'type_embed_net' + suffix - if not self.use_linear: - with tf.variable_scope(name, reuse=reuse): - ebd_type = embedding_net( - ebd_type, - self.neuron, - activation_fn = self.filter_activation_fn, - precision = self.filter_precision, - resnet_dt = self.filter_resnet_dt, - seed = self.seed, - trainable = self.trainable, - initial_variables = self.type_embedding_net_variables, - uniform_seed = self.uniform_seed) - else: - ebd_type = one_layer( + with tf.variable_scope(name, reuse=reuse): + ebd_type = embedding_net( ebd_type, - self.neuron[-1], - name=name, - reuse=reuse, - seed=self.seed, - activation_fn=None, - precision=self.filter_precision, + self.neuron, + activation_fn = self.filter_activation_fn, + precision = self.filter_precision, + resnet_dt = self.filter_resnet_dt, + seed = self.seed, trainable = self.trainable, - uniform_seed=self.uniform_seed) + initial_variables = self.type_embedding_net_variables, + uniform_seed = self.uniform_seed) ebd_type = tf.reshape(ebd_type, [-1, self.neuron[-1]]) # ntypes * neuron[-1] if self.padding: last_type = tf.cast(tf.zeros([1, self.neuron[-1]]), self.filter_precision) - ebd_type = tf.concat([ebd_type, last_type], 0) + ebd_type = tf.concat([ebd_type, last_type], 0) # (ntypes + 1) * neuron[-1] self.ebd_type = tf.identity(ebd_type, name ='t_typeebd') return self.ebd_type diff --git a/doc/data/data-conv.md b/doc/data/data-conv.md index d3c0632464..ee98ecf556 100644 --- a/doc/data/data-conv.md +++ b/doc/data/data-conv.md @@ -30,6 +30,8 @@ O H ``` The type `0` is named by `"O"` and the type `1` is named by `"H"`. +For training models with descriptor `se_atten`, a [new system format](../model/train-se-atten.md#data-format) is supported to put together the frame-sparse systems with the same atom number. + ## HDF5 format A system with the HDF5 format has the same strucutre as the Numpy format, but in a HDF5 file, a system is organized as an [HDF5 group](https://docs.h5py.org/en/stable/high/group.html). The file name of a Numpy file is the key in a HDF5 file, and the data is the value to the key. One need to use `#` in a DP path to divide the path to the HDF5 file and the HDF5 key: diff --git a/doc/data/system.md b/doc/data/system.md index afaa5c3d17..d94c325cf5 100644 --- a/doc/data/system.md +++ b/doc/data/system.md @@ -1,6 +1,6 @@ # System -DeePMD-kit takes a **system** as data structure. A snapshot of a system is called a **frame**. A system may contain multiple frames with the same atom types and numbers, i.e. the same formula (like `H2O`). To contains data with different formula, one need to divide data into multiple systems. +DeePMD-kit takes a **system** as data structure. A snapshot of a system is called a **frame**. A system may contain multiple frames with the same atom types and numbers, i.e. the same formula (like `H2O`). To contains data with different formula, one usually need to divide data into multiple systems, which may sometimes result in sparse-frame systems. See a [new system format](../model/train-se-atten.md#data-format) to further combine different systems with the same atom numbers, when training with descriptor `se_atten`. A system should contain system properties, input frame properties, and labeled frame properties. The system property contains the following property: diff --git a/doc/images/model_se_atten.png b/doc/images/model_se_atten.png index f1a247be30cf41db6930c14eb8289c2e89e31511..c7fbb6d9c449406c69601851e5b4b4695b50088c 100644 GIT binary patch literal 99657 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

=IJ4%qXsf2CRmL&$Z8iBVtMTsB|( zZJ0y9);Z#9(~fo8N=Fg<(N{{)XHzu)s^^%;A-ZfZr419{HW~@&PZju7re)%>Jmwkl z;}x$@8)z4C#hrdx%v6T8IyAZZ9Wv3WKmDPZ+$1FMA^1aqfLprH{QwY=r}D)&$@Gfez)V^`V}q#tz8|Ui^f^4M@HWpo6Am@ z+66vQ#)pGNk+vcy%_@ymqE1^q#C zpmdBB8l{Qo(&oe)oN?^G`Yw6}F8>mZKV=)dsc4D_Ar@jhyxs-B&z3V$FGP1`9)cv{ zOFC*}yLxv9VPW|D9nF=PEOAeL<75(NHK{kPw(|YY)6M<2Els`y<-j{o^0!)%eQ&so zw%GG?2P$CcEfMH6Xcs;cg~0Js&k@C2w$_M^gLT0!u9uGoO_Lp!JG&Hca;l9_O~R0bP!=B| zd)j8C5|MEO*lL=-+$t7{?}oJqf8zTqo)r90{}jl%w{J zhwCfoIx((_i?=jrC=+EFoh&s!2Mi4ubGL4Q;>VIs<&?y}{yC-7_zqpJ4U*G;(`*S3 z_`x5t4q?h<&1N_8_Q1=%TADUX$oH=Qu}XhX^SyhX=JrTskc1^eV#vJbl}l9=)mSj2 zaToGXI|gcDm~QgzrTUm6=Jl60bhhc9SZHeE?OG|eiyHhvpQ{#oWtJ8Uh&a|xNjyY2 zY3?P+6zW}OnhMzCk8ODJ>g@|$^_!dKYf}$A>4TSbw;25ZiK3*y|KL`2*)eTRyT_&} zdesX8g7>xhiq^ZxbWC77E2f5kuXr=@@>M}c&}Kvh?2+2^h;l~~RBarj<`}?0>RMX| zEnxB@MnK#UM|Wz5YLIi?#e6^L+}n6l0S4sFAwk;VB}GEfpmZrFC$8HNFa0yN_Sa$y zcM@&{8XY0@@j`3^Pd2FaDRMY85|qWnBN5g2#lYSVHNJeC%zfYC(S3l9fzGws@4?YR zZrQ(=__RPlBxwwL6ZUSM65n?83}cN9PKXD8sSNf>eI~p&`Ga~2kf_7}J$VpS>b51w ziOdQ#Uj6Ib^Q9?W%S-=j0?E!#pOuWoLZ|caqvQK{D0;Pk$ zv8iV{5_nJKj|51LS4AB%M&xp1#KXk&-g4~S^$k<$7ttt6Xm}1Q!%G5@mq`NvFHw(Q z#H+2R+7FsY*ixWHCmINl4M%-x-g~psLWw-OH4+sYx1TUF*-=+es3_CyQuRK3SzFZR z9u%@cRgKAp;!H!zQ$Q1w5<1QvP~ZqxyX4y{${Y{VK|^s3CToct1&odpIT{mGwdu6__OI13P{N?I|3t7!-k%bs(}Pi+ zv)94|-8nUk@G8ZRn$JaE5l$!GxxNZ$2yDM)hS2R!A}ms9QER-Bg$9VL(%ch2JMKp- z>xAawPIp>tA@?S_S52O3t;LyC3r$`ZKTP}$f41ps=%ZvzTjvChCHnmF6`SId3agsI zAliHDf7{=bR2JDLu5@Xt*PT?VnfHJWH}?0qHeKTjIU4|NM4o5L2URCly`tD zr^>Txspj8m`e=@(5gHivUbZ|$qu8Q4&h@`Az5-^=;1;P>-6OuJK6fJ(6x<@5Sq=qN z35CK7c1QVMF_7dJYJO2A+*P7!>EhJ{g;3SMV4>am&c}L}b%o?(+-l5@&sk@AmY*aa zyr6?JbJ|;6Q*{WYLGrPGK>xiHI zd$w;#f!c1ngPl;Qx8K&PG)|b5?pF41)S)m0j1-;s{2sHC%)h_-EP%VA1g3%h4F)p< zP@hGYp|5i!!Rt;S%d~}pIC7yt(cMwaVwMtj_eaRXAvyGO!5KnlAQ_rT4$N!iAsu@N zgjhM$h^ZUpEkDBi*tLP7G}~Bt!7rAheLB5bl>QpY zoqxLdv|85C*L!t(8{i@+sah)Yp0iuewAv0o(Z3=2MPj1PxyR>R>OG+7OAw{%HgA%5|yH_osK?@ri??-aB(K;hraIt4usl;x8 z#vysJ`-KV03po$LXbpKfuDSXOS6tV9YxolEXfxQLZV*>(MyxJy^tL5`lkP(3gkDay zzZOcx3N&K33R(G;4BFoqeXv2;4fywZ|$=E11i<`z)=s%rgHps zj+LC6%6%@qyJPr8#x#^1h39*!E%8q?`es@1zkBXUj~`U(pK+fLKvdU#n zQd$OsU5+Sd`B54uWGMoodC&SIKnNTy)v-9%K3gNOL%O&AP>TI-wu3qXq)d*0WO4}) ztM=kYl^-MArB5p3dp!Abe~t}j+42GK66WWsBQBJ5w|De5eF5=~kfp|jN355R!hxt< z9AOCgQ%q}*N{oNd{EDE{FQjN< z!kO9t_aM+BtXB#II2f)pC zdO9pF!ceVlAatEeQclpFZ~H79gG^E_V8YjPqKy_;IlKFA%N6hSN|R;cS!Yoj(ss#! zfx_2GPT}u3i*(Cg6H@joC*A7hS8J7gTgD)l#bY Il&N?}PA@JU5kVCM-Q(Q4snO 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[w<x1k%TJFD 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 U#u9Ster-j*+x)$+c sec); + const std::vector sec, + const int * f_type = NULL); template void prod_env_mat_r_cpu( @@ -41,25 +42,6 @@ void prod_env_mat_r_cpu( const float rcut_smth, const std::vector sec); -template -void prod_env_mat_a_mix_cpu( - FPTYPE * em, - FPTYPE * em_deriv, - FPTYPE * rij, - int * nlist, - const FPTYPE * coord, - const int * f_type, - const int * type, - const InputNlist & inlist, - const int max_nbor_size, - const FPTYPE * avg, - const FPTYPE * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec); - #if GOOGLE_CUDA template void prod_env_mat_a_gpu_cuda( @@ -79,7 +61,8 @@ void prod_env_mat_a_gpu_cuda( const int nall, const float rcut, const float rcut_smth, - const std::vector sec); + const std::vector sec, + const int * f_type=NULL); template void prod_env_mat_r_gpu_cuda( @@ -101,27 +84,6 @@ void prod_env_mat_r_gpu_cuda( const float rcut_smth, const std::vector sec); -template -void prod_env_mat_a_mix_gpu_cuda( - FPTYPE * em, - FPTYPE * em_deriv, - FPTYPE * rij, - int * nlist, - const FPTYPE * coord, - const int * f_type, - const int * type, - const InputNlist & gpu_inlist, - int * array_int, - unsigned long long * array_longlong, - const int max_nbor_size, - const FPTYPE * avg, - const FPTYPE * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec); - void env_mat_nbor_update( InputNlist &inlist, InputNlist &gpu_inlist, @@ -150,7 +112,8 @@ void prod_env_mat_a_gpu_rocm( const int nall, const float rcut, const float rcut_smth, - const std::vector sec); + const std::vector sec, + const int * f_type=NULL); template void prod_env_mat_r_gpu_rocm( @@ -172,27 +135,6 @@ void prod_env_mat_r_gpu_rocm( const float rcut_smth, const std::vector sec); -template -void prod_env_mat_a_mix_gpu_rocm( - FPTYPE * em, - FPTYPE * em_deriv, - FPTYPE * rij, - int * nlist, - const FPTYPE * coord, - const int * f_type, - const int * type, - const InputNlist & gpu_inlist, - int * array_int, - unsigned long long * array_longlong, - const int max_nbor_size, - const FPTYPE * avg, - const FPTYPE * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec); - void env_mat_nbor_update( InputNlist &inlist, InputNlist &gpu_inlist, diff --git a/source/lib/src/cuda/prod_env_mat.cu b/source/lib/src/cuda/prod_env_mat.cu index 05c42df8e5..a68067e949 100644 --- a/source/lib/src/cuda/prod_env_mat.cu +++ b/source/lib/src/cuda/prod_env_mat.cu @@ -610,8 +610,12 @@ void prod_env_mat_a_gpu_cuda( const int nall, const float rcut, const float rcut_smth, - const std::vector sec) + const std::vector sec, + const int * f_type) { + if (f_type == NULL){ + f_type = type; + } const int nnei = sec.back(); const int ndescrpt = nnei * 4; DPErrcheck(cudaMemset(em, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt)); @@ -620,7 +624,7 @@ void prod_env_mat_a_gpu_cuda( format_nbor_list_gpu_cuda( nlist, - coord, type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); + coord, f_type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); nborErrcheck(cudaGetLastError()); nborErrcheck(cudaDeviceSynchronize()); @@ -670,46 +674,6 @@ void prod_env_mat_r_gpu_cuda( DPErrcheck(cudaDeviceSynchronize()); } -template -void prod_env_mat_a_mix_gpu_cuda( - FPTYPE * em, - FPTYPE * em_deriv, - FPTYPE * rij, - int * nlist, - const FPTYPE * coord, - const int * f_type, - const int * type, - const InputNlist & gpu_inlist, - int * array_int, - uint_64 * array_longlong, - const int max_nbor_size, - const FPTYPE * avg, - const FPTYPE * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec) -{ - const int nnei = sec.back(); - const int ndescrpt = nnei * 4; - DPErrcheck(cudaMemset(em, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt)); - DPErrcheck(cudaMemset(em_deriv, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt * 3)); - DPErrcheck(cudaMemset(rij, 0, sizeof(FPTYPE) * int_64(nloc) * nnei * 3)); - - format_nbor_list_gpu_cuda( - nlist, - coord, f_type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); - nborErrcheck(cudaGetLastError()); - nborErrcheck(cudaDeviceSynchronize()); - - compute_env_mat_a <<>> ( - em, em_deriv, rij, - coord, avg, std, type, nlist, nnei, rcut_smth, rcut); - DPErrcheck(cudaGetLastError()); - DPErrcheck(cudaDeviceSynchronize()); -} - template void test_encoding_decoding_nbor_info_gpu_cuda( uint_64 * key, @@ -728,12 +692,10 @@ void test_encoding_decoding_nbor_info_gpu_cuda( DPErrcheck(cudaDeviceSynchronize()); } -template void prod_env_mat_a_gpu_cuda(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); -template void prod_env_mat_a_gpu_cuda(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); +template void prod_env_mat_a_gpu_cuda(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec, const int * f_type); +template void prod_env_mat_a_gpu_cuda(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec, const int * f_type); template void prod_env_mat_r_gpu_cuda(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void prod_env_mat_r_gpu_cuda(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); -template void prod_env_mat_a_mix_gpu_cuda(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); -template void prod_env_mat_a_mix_gpu_cuda(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void format_nbor_list_gpu_cuda(int * nlist, const float * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void format_nbor_list_gpu_cuda(int * nlist, const double * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void test_encoding_decoding_nbor_info_gpu_cuda(uint_64 * key, int * out_type, int * out_index, const int * in_type, const float * in_dist, const int * in_index, const int size_of_array); diff --git a/source/lib/src/prod_env_mat.cc b/source/lib/src/prod_env_mat.cc index 12270dd832..d64e6a4b09 100644 --- a/source/lib/src/prod_env_mat.cc +++ b/source/lib/src/prod_env_mat.cc @@ -25,8 +25,12 @@ prod_env_mat_a_cpu( const int nall, const float rcut, const float rcut_smth, - const std::vector sec) + const std::vector sec, + const int * f_type) { + if (f_type == NULL){ + f_type = type; + } const int nnei = sec.back(); const int nem = nnei * 4; @@ -39,11 +43,11 @@ prod_env_mat_a_cpu( } // set type - std::vector d_type (nall); + std::vector d_f_type(nall); for (int ii = 0; ii < nall; ++ii) { - d_type[ii] = type[ii]; + d_f_type[ii] = f_type[ii]; } - + // build nlist std::vector > d_nlist_a(nloc); @@ -62,13 +66,13 @@ prod_env_mat_a_cpu( #pragma omp parallel for for (int ii = 0; ii < nloc; ++ii) { std::vector fmt_nlist_a; - int ret = format_nlist_i_cpu(fmt_nlist_a, d_coord3, d_type, ii, d_nlist_a[ii], rcut, sec); + int ret = format_nlist_i_cpu(fmt_nlist_a, d_coord3, d_f_type, ii, d_nlist_a[ii], rcut, sec); std::vector d_em_a; std::vector d_em_a_deriv; std::vector d_em_r; std::vector d_em_r_deriv; std::vector d_rij_a; - env_mat_a_cpu (d_em_a, d_em_a_deriv, d_rij_a, d_coord3, d_type, ii, fmt_nlist_a, sec, rcut_smth, rcut); + env_mat_a_cpu (d_em_a, d_em_a_deriv, d_rij_a, d_coord3, d_f_type, ii, fmt_nlist_a, sec, rcut_smth, rcut); // check sizes assert (d_em_a.size() == nem); @@ -77,10 +81,10 @@ prod_env_mat_a_cpu( assert (fmt_nlist_a.size() == nnei); // record outputs for (int jj = 0; jj < nem; ++jj) { - em[ii * nem + jj] = (d_em_a[jj] - avg[d_type[ii] * nem + jj]) / std[d_type[ii] * nem + jj]; + em[ii * nem + jj] = (d_em_a[jj] - avg[type[ii] * nem + jj]) / std[type[ii] * nem + jj]; } for (int jj = 0; jj < nem * 3; ++jj) { - em_deriv[ii * nem * 3 + jj] = d_em_a_deriv[jj] / std[d_type[ii] * nem + jj / 3]; + em_deriv[ii * nem * 3 + jj] = d_em_a_deriv[jj] / std[type[ii] * nem + jj / 3]; } for (int jj = 0; jj < nnei * 3; ++jj) { rij[ii * nnei * 3 + jj] = d_rij_a[jj]; @@ -175,112 +179,6 @@ prod_env_mat_r_cpu( } } -template -void -deepmd:: -prod_env_mat_a_mix_cpu( - FPTYPE * em, - FPTYPE * em_deriv, - FPTYPE * rij, - int * nlist, - const FPTYPE * coord, - const int * f_type, - const int * type, - const InputNlist & inlist, - const int max_nbor_size, - const FPTYPE * avg, - const FPTYPE * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec) -{ - const int nnei = sec.back(); - const int nem = nnei * 4; - memset(em, 0.0, sizeof(FPTYPE) * nloc * nem); - memset(em_deriv, 0.0, sizeof(FPTYPE) * nloc * nem * 3); - memset(rij, 0.0, sizeof(FPTYPE) * nloc * nnei * 3); - - // set & normalize coord - std::vector d_coord3(nall * 3); - for (int ii = 0; ii < nall; ++ii) { - for (int dd = 0; dd < 3; ++dd) { - d_coord3[ii * 3 + dd] = coord[ii * 3 + dd]; - } - } - - // set type - std::vector d_f_type (nall); - std::vector d_type (nall); - for (int ii = 0; ii < nall; ++ii) { - d_f_type[ii] = f_type[ii]; - d_type[ii] = type[ii]; - } - - // build nlist - std::vector > d_nlist_a(nloc); - - assert(nloc == inlist.inum); - for (unsigned ii = 0; ii < nloc; ++ii) { - d_nlist_a[ii].reserve(max_nbor_size); - } - for (unsigned ii = 0; ii < nloc; ++ii) { - int i_idx = inlist.ilist[ii]; - for(unsigned jj = 0; jj < inlist.numneigh[ii]; ++jj){ - int j_idx = inlist.firstneigh[ii][jj]; - d_nlist_a[i_idx].push_back (j_idx); - } - } - -#pragma omp parallel for - for (int ii = 0; ii < nloc; ++ii) { - std::vector fmt_nlist_a; - int ret = format_nlist_i_cpu(fmt_nlist_a, d_coord3, d_f_type, ii, d_nlist_a[ii], rcut, sec); - std::vector d_em_a; - std::vector d_em_a_deriv; - std::vector d_em_r; - std::vector d_em_r_deriv; - std::vector d_rij_a; - env_mat_a_cpu (d_em_a, d_em_a_deriv, d_rij_a, d_coord3, d_f_type, ii, fmt_nlist_a, sec, rcut_smth, rcut); - - // check sizes - assert (d_em_a.size() == nem); - assert (d_em_a_deriv.size() == nem * 3); - assert (d_rij_a.size() == nnei * 3); - assert (fmt_nlist_a.size() == nnei); - // record outputs - for (int jj = 0; jj < nnei; ++jj) { - int temp_nei = fmt_nlist_a[jj]; - nlist[ii * nnei + jj] = temp_nei; - if(temp_nei >= 0){ - for (int kk = 0; kk < 3; ++kk){ - rij[ii * nnei * 3 + jj*3 + kk] = d_rij_a[jj*3 + kk]; - } - for (int kk = 0; kk < 4; ++kk) { - em[ii * nem + jj * 4 + kk] = (d_em_a[jj * 4 + kk] - avg[d_type[ii] * nem + jj * 4 + kk]) / std[d_type[ii] * nem + jj * 4 + kk]; - } - for (int kk = 0; kk < 12; ++kk) { - em_deriv[ii * nem * 3 + jj * 4 * 3 + kk] = d_em_a_deriv[jj * 4 * 3 + kk] / std[d_type[ii] * nem + jj * 4 + kk / 3]; - } - } - } - // for (int jj = 0; jj < nem; ++jj) { - // em[ii * nem + jj] = (d_em_a[jj] - avg[d_type[ii] * nem + jj]) / std[d_type[ii] * nem + jj]; - // } - // for (int jj = 0; jj < nem * 3; ++jj) { - // em_deriv[ii * nem * 3 + jj] = d_em_a_deriv[jj] / std[d_type[ii] * nem + jj / 3]; - // } - // for (int jj = 0; jj < nnei * 3; ++jj) { - // rij[ii * nnei * 3 + jj] = d_rij_a[jj]; - // } - // for (int jj = 0; jj < nnei; ++jj) { - // nlist[ii * nnei + jj] = fmt_nlist_a[jj]; - // } - } -} - - template void deepmd:: @@ -299,7 +197,8 @@ prod_env_mat_a_cpu( const int nall, const float rcut, const float rcut_smth, - const std::vector sec); + const std::vector sec, + const int * f_type); template void @@ -319,7 +218,8 @@ prod_env_mat_a_cpu( const int nall, const float rcut, const float rcut_smth, - const std::vector sec); + const std::vector sec, + const int * f_type); template void @@ -361,48 +261,6 @@ prod_env_mat_r_cpu( const float rcut_smth, const std::vector sec); -template -void -deepmd:: -prod_env_mat_a_mix_cpu( - double * em, - double * em_deriv, - double * rij, - int * nlist, - const double * coord, - const int * f_type, - const int * type, - const InputNlist & inlist, - const int max_nbor_size, - const double * avg, - const double * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec); - -template -void -deepmd:: -prod_env_mat_a_mix_cpu( - float * em, - float * em_deriv, - float * rij, - int * nlist, - const float * coord, - const int * f_type, - const int * type, - const InputNlist & inlist, - const int max_nbor_size, - const float * avg, - const float * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec); - #if GOOGLE_CUDA || TENSORFLOW_USE_ROCM void deepmd::env_mat_nbor_update( InputNlist &inlist, diff --git a/source/lib/src/rocm/prod_env_mat.hip.cu b/source/lib/src/rocm/prod_env_mat.hip.cu index aa58ea9e24..ce6227a7f8 100644 --- a/source/lib/src/rocm/prod_env_mat.hip.cu +++ b/source/lib/src/rocm/prod_env_mat.hip.cu @@ -608,8 +608,12 @@ void prod_env_mat_a_gpu_rocm( const int nall, const float rcut, const float rcut_smth, - const std::vector sec) + const std::vector sec, + const int * f_type) { + if (f_type == NULL){ + f_type = type; + } const int nnei = sec.back(); const int ndescrpt = nnei * 4; DPErrcheck(hipMemset(em, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt)); @@ -618,7 +622,7 @@ void prod_env_mat_a_gpu_rocm( format_nbor_list_gpu_rocm( nlist, - coord, type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); + coord, f_type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); nborErrcheck(hipGetLastError()); nborErrcheck(hipDeviceSynchronize()); @@ -668,46 +672,6 @@ void prod_env_mat_r_gpu_rocm( DPErrcheck(hipDeviceSynchronize()); } -template -void prod_env_mat_a_mix_gpu_rocm( - FPTYPE * em, - FPTYPE * em_deriv, - FPTYPE * rij, - int * nlist, - const FPTYPE * coord, - const int * f_type, - const int * type, - const InputNlist & gpu_inlist, - int * array_int, - uint_64 * array_longlong, - const int max_nbor_size, - const FPTYPE * avg, - const FPTYPE * std, - const int nloc, - const int nall, - const float rcut, - const float rcut_smth, - const std::vector sec) -{ - const int nnei = sec.back(); - const int ndescrpt = nnei * 4; - DPErrcheck(hipMemset(em, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt)); - DPErrcheck(hipMemset(em_deriv, 0, sizeof(FPTYPE) * int_64(nloc) * ndescrpt * 3)); - DPErrcheck(hipMemset(rij, 0, sizeof(FPTYPE) * int_64(nloc) * nnei * 3)); - - format_nbor_list_gpu_rocm( - nlist, - coord, f_type, gpu_inlist, array_int, array_longlong, max_nbor_size, nloc, nall, rcut, sec); - nborErrcheck(hipGetLastError()); - nborErrcheck(hipDeviceSynchronize()); - - hipLaunchKernelGGL(HIP_KERNEL_NAME(compute_env_mat_a), nloc, TPB, 0, 0, - em, em_deriv, rij, - coord, avg, std, type, nlist, nnei, rcut_smth, rcut); - DPErrcheck(hipGetLastError()); - DPErrcheck(hipDeviceSynchronize()); -} - template void test_encoding_decoding_nbor_info_gpu_rocm( uint_64 * key, @@ -726,12 +690,10 @@ void test_encoding_decoding_nbor_info_gpu_rocm( DPErrcheck(hipDeviceSynchronize()); } -template void prod_env_mat_a_gpu_rocm(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); -template void prod_env_mat_a_gpu_rocm(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); +template void prod_env_mat_a_gpu_rocm(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec, const int * f_type); +template void prod_env_mat_a_gpu_rocm(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec, const int * f_type); template void prod_env_mat_r_gpu_rocm(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void prod_env_mat_r_gpu_rocm(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); -template void prod_env_mat_a_mix_gpu_rocm(float * em, float * em_deriv, float * rij, int * nlist, const float * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const float * avg, const float * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); -template void prod_env_mat_a_mix_gpu_rocm(double * em, double * em_deriv, double * rij, int * nlist, const double * coord, const int * f_type, const int * type, const InputNlist & gpu_inlist, int * array_int, unsigned long long * array_longlong, const int max_nbor_size, const double * avg, const double * std, const int nloc, const int nall, const float rcut, const float rcut_smth, const std::vector sec); template void format_nbor_list_gpu_rocm(int * nlist, const float * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void format_nbor_list_gpu_rocm(int * nlist, const double * coord, const int * type, const deepmd::InputNlist & gpu_inlist,int * array_int,uint_64 * array_longlong,const int max_nbor_size,const int nloc, const int nall, const float rcut, const std::vector sec); template void test_encoding_decoding_nbor_info_gpu_rocm(uint_64 * key, int * out_type, int * out_index, const int * in_type, const float * in_dist, const int * in_index, const int size_of_array); diff --git a/source/lib/tests/test_env_mat_a_mix.cc b/source/lib/tests/test_env_mat_a_mix.cc index 4a83c917fb..d056aa1d70 100644 --- a/source/lib/tests/test_env_mat_a_mix.cc +++ b/source/lib/tests/test_env_mat_a_mix.cc @@ -443,13 +443,12 @@ TEST_F(TestEnvMatAMix, prod_cpu) std::vector nmask(nloc * nnei); std::vector avg(ntypes * ndescrpt, 0); std::vector std(ntypes * ndescrpt, 1); - deepmd::prod_env_mat_a_mix_cpu( + deepmd::prod_env_mat_a_cpu( &em[0], &em_deriv[0], &rij[0], &nlist[0], &posi_cpy[0], - &f_atype_cpy[0], &atype[0], inlist, max_nbor_size, @@ -459,7 +458,8 @@ TEST_F(TestEnvMatAMix, prod_cpu) nall, rc, rc_smth, - sec_a); + sec_a, + &f_atype_cpy[0]); deepmd::use_nei_info_cpu( &nlist[0], &ntype[0], @@ -503,13 +503,12 @@ TEST_F(TestEnvMatAMix, prod_cpu_equal_cpu) std::vector nlist(nloc * nnei); std::vector avg(ntypes * ndescrpt, 0); std::vector std(ntypes * ndescrpt, 1); - deepmd::prod_env_mat_a_mix_cpu( + deepmd::prod_env_mat_a_cpu( &em[0], &em_deriv[0], &rij[0], &nlist[0], &posi_cpy[0], - &f_atype_cpy[0], &atype[0], inlist, max_nbor_size, @@ -519,7 +518,8 @@ TEST_F(TestEnvMatAMix, prod_cpu_equal_cpu) nall, rc, rc_smth, - sec_a); + sec_a, + &f_atype_cpy[0]); std::vector fmt_nlist_a_1, fmt_nlist_r_1; std::vector env_1, env_deriv_1, rij_a_1; @@ -615,13 +615,12 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda) deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); - deepmd::prod_env_mat_a_mix_gpu_cuda( + deepmd::prod_env_mat_a_gpu_cuda( em_dev, em_deriv_dev, rij_dev, nlist_dev, posi_cpy_dev, - f_atype_cpy_dev, atype_dev, gpu_inlist, array_int_dev, @@ -633,7 +632,8 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda) nall, rc, rc_smth, - sec_a); + sec_a, + f_atype_cpy_dev); deepmd::use_nei_info_gpu( nlist_dev, @@ -728,13 +728,12 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda_equal_cpu) deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); - deepmd::prod_env_mat_a_mix_gpu_cuda( + deepmd::prod_env_mat_a_gpu_cuda( em_dev, em_deriv_dev, rij_dev, nlist_dev, - posi_cpy_dev, - f_atype_cpy_dev, + posi_cpy_dev, atype_dev, gpu_inlist, array_int_dev, @@ -746,7 +745,8 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda_equal_cpu) nall, rc, rc_smth, - sec_a); + sec_a, + f_atype_cpy_dev); deepmd::memcpy_device_to_host(em_dev, em); deepmd::memcpy_device_to_host(em_deriv_dev, em_deriv); deepmd::memcpy_device_to_host(rij_dev, rij); @@ -858,13 +858,12 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm) deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); - deepmd::prod_env_mat_a_mix_gpu_rocm( + deepmd::prod_env_mat_a_gpu_rocm( em_dev, em_deriv_dev, rij_dev, nlist_dev, posi_cpy_dev, - f_atype_cpy_dev, atype_dev, gpu_inlist, array_int_dev, @@ -876,7 +875,8 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm) nall, rc, rc_smth, - sec_a); + sec_a, + f_atype_cpy_dev); deepmd::use_nei_info_gpu_rocm( nlist_dev, @@ -971,13 +971,12 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm_equal_cpu) deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); deepmd::convert_nlist_gpu_device(gpu_inlist, inlist, memory_dev, max_nbor_size); - deepmd::prod_env_mat_a_mix_gpu_rocm( + deepmd::prod_env_mat_a_gpu_rocm( em_dev, em_deriv_dev, rij_dev, nlist_dev, posi_cpy_dev, - f_atype_cpy_dev, atype_dev, gpu_inlist, array_int_dev, @@ -989,7 +988,8 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm_equal_cpu) nall, rc, rc_smth, - sec_a); + sec_a, + f_atype_cpy_dev); deepmd::memcpy_device_to_host(em_dev, em); deepmd::memcpy_device_to_host(em_deriv_dev, em_deriv); deepmd::memcpy_device_to_host(rij_dev, rij); diff --git a/source/op/prod_env_mat_multi_device.cc b/source/op/prod_env_mat_multi_device.cc index 22f2ba6ad3..ed5ca1b810 100644 --- a/source/op/prod_env_mat_multi_device.cc +++ b/source/op/prod_env_mat_multi_device.cc @@ -1166,9 +1166,9 @@ class ProdEnvMatAMixOp : public OpKernel { array_longlong = uint64_temp.flat().data(); // launch the gpu(nv) compute function - deepmd::prod_env_mat_a_mix_gpu_cuda( + deepmd::prod_env_mat_a_gpu_cuda( em, em_deriv, rij, nlist, - coord, f_type, type, gpu_inlist, array_int, array_longlong, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a); + coord, type, gpu_inlist, array_int, array_longlong, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a, f_type); _map_nei_info_gpu(nlist, ntype, nmask, type, idx_mapping, nloc, nnei, ntypes, b_nlist_map); deepmd::delete_device_memory(firstneigh); #endif //GOOGLE_CUDA @@ -1210,9 +1210,9 @@ class ProdEnvMatAMixOp : public OpKernel { array_longlong = uint64_temp.flat().data(); // launch the gpu(nv) compute function - deepmd::prod_env_mat_a_mix_gpu_rocm( + deepmd::prod_env_mat_a_gpu_rocm( em, em_deriv, rij, nlist, - coord, f_type, type, gpu_inlist, array_int, array_longlong, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a); + coord, type, gpu_inlist, array_int, array_longlong, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a, f_type); _map_nei_info_gpu_rocm(nlist, ntype, nmask, type, idx_mapping, nloc, nnei, ntypes, b_nlist_map); deepmd::delete_device_memory(firstneigh); #endif //TENSORFLOW_USE_ROCM @@ -1236,9 +1236,9 @@ class ProdEnvMatAMixOp : public OpKernel { frame_nall, mem_cpy, mem_nnei, max_nbor_size, box, mesh_tensor.flat().data(), nloc, nei_mode, rcut_r, max_cpy_trial, max_nnei_trial); // launch the cpu compute function - deepmd::prod_env_mat_a_mix_cpu( + deepmd::prod_env_mat_a_cpu( em, em_deriv, rij, nlist, - coord, f_type, type, inlist, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a); + coord, type, inlist, max_nbor_size, avg, std, nloc, frame_nall, rcut_r, rcut_r_smth, sec_a, f_type); // do nlist mapping if coords were copied _map_nei_info_cpu(nlist, ntype, nmask, type, &idx_mapping[0], nloc, nnei, ntypes, b_nlist_map); } diff --git a/source/tests/common.py b/source/tests/common.py index 1187a11036..70b8794bfc 100644 --- a/source/tests/common.py +++ b/source/tests/common.py @@ -24,57 +24,64 @@ def j_loader(filename): def del_data(): if os.path.isdir('system'): shutil.rmtree('system') - if os.path.isdir('system_large_batch'): - shutil.rmtree('system_large_batch') + if os.path.isdir('system_mixed_type'): + shutil.rmtree('system_mixed_type') -def gen_data(nframes = 1, large_batch_mode=False) : - tmpdata = Data(rand_pert = 0.1, seed = 1, nframes = nframes) +def gen_data_type_specific(nframes = 1): + tmpdata = Data(rand_pert=0.1, seed=1, nframes=nframes) sys = dpdata.LabeledSystem() - if not large_batch_mode: - sys.data['atom_names'] = ['foo', 'bar'] - sys.data['coords'] = tmpdata.coord - sys.data['atom_types'] = tmpdata.atype - sys.data['cells'] = tmpdata.cell - nframes = tmpdata.nframes - natoms = tmpdata.natoms - sys.data['coords'] = sys.data['coords'].reshape([nframes,natoms,3]) - sys.data['cells'] = sys.data['cells'].reshape([nframes,3,3]) - sys.data['energies'] = np.zeros([nframes,1]) - sys.data['forces'] = np.zeros([nframes,natoms,3]) - sys.to_deepmd_npy('system', prec=np.float64) - np.save('system/set.000/fparam.npy', tmpdata.fparam) - np.save('system/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) - else: - real_type_map = ['foo', 'bar'] - sys.data['atom_names'] = ['X'] - sys.data['coords'] = tmpdata.coord - sys.data['atom_types'] = np.zeros_like(tmpdata.atype) - sys.data['cells'] = tmpdata.cell - nframes = tmpdata.nframes - natoms = tmpdata.natoms - sys.data['coords'] = sys.data['coords'].reshape([nframes, natoms, 3]) - sys.data['cells'] = sys.data['cells'].reshape([nframes, 3, 3]) - sys.data['energies'] = np.zeros([nframes, 1]) - sys.data['forces'] = np.zeros([nframes, natoms, 3]) - sys.to_deepmd_npy('system_large_batch', prec=np.float64) - real_atom_numbs = np.array([0 for i in range(len(real_type_map))]) - for i in range(len(real_type_map)): - real_atom_numbs[i] = (tmpdata.atype == i).sum() - np.savetxt('system_large_batch/type_map.raw', real_type_map, fmt='%s') - np.save('system_large_batch/set.000/real_atom_types.npy', tmpdata.atype.reshape(1, -1).repeat(nframes, 0)) - np.save('system_large_batch/set.000/real_atom_numbs.npy', real_atom_numbs.reshape(1, -1).repeat(nframes, 0)) - np.save('system_large_batch/set.000/fparam.npy', tmpdata.fparam) - np.save('system_large_batch/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) + sys.data['atom_names'] = ['foo', 'bar'] + sys.data['coords'] = tmpdata.coord + sys.data['atom_types'] = tmpdata.atype + sys.data['cells'] = tmpdata.cell + nframes = tmpdata.nframes + natoms = tmpdata.natoms + sys.data['coords'] = sys.data['coords'].reshape([nframes, natoms, 3]) + sys.data['cells'] = sys.data['cells'].reshape([nframes, 3, 3]) + sys.data['energies'] = np.zeros([nframes, 1]) + sys.data['forces'] = np.zeros([nframes, natoms, 3]) + sys.to_deepmd_npy('system', prec=np.float64) + np.save('system/set.000/fparam.npy', tmpdata.fparam) + np.save('system/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) + +def gen_data_mixed_type(nframes = 1): + tmpdata = Data(rand_pert=0.1, seed=1, nframes=nframes) + sys = dpdata.LabeledSystem() + real_type_map = ['foo', 'bar'] + sys.data['atom_names'] = ['X'] + sys.data['coords'] = tmpdata.coord + sys.data['atom_types'] = np.zeros_like(tmpdata.atype) + sys.data['cells'] = tmpdata.cell + nframes = tmpdata.nframes + natoms = tmpdata.natoms + sys.data['coords'] = sys.data['coords'].reshape([nframes, natoms, 3]) + sys.data['cells'] = sys.data['cells'].reshape([nframes, 3, 3]) + sys.data['energies'] = np.zeros([nframes, 1]) + sys.data['forces'] = np.zeros([nframes, natoms, 3]) + sys.to_deepmd_npy('system_mixed_type', prec=np.float64) + real_atom_numbs = np.array([0 for i in range(len(real_type_map))]) + for i in range(len(real_type_map)): + real_atom_numbs[i] = (tmpdata.atype == i).sum() + np.savetxt('system_mixed_type/type_map.raw', real_type_map, fmt='%s') + np.save('system_mixed_type/set.000/real_atom_types.npy', tmpdata.atype.reshape(1, -1).repeat(nframes, 0)) + np.save('system_mixed_type/set.000/real_atom_numbs.npy', real_atom_numbs.reshape(1, -1).repeat(nframes, 0)) + np.save('system_mixed_type/set.000/fparam.npy', tmpdata.fparam) + np.save('system_mixed_type/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) +def gen_data(nframes = 1, mixed_type=False) : + if not mixed_type: + gen_data_type_specific(nframes) + else: + gen_data_mixed_type(nframes) class Data(): - def __init__ (self, - rand_pert = 0.1, - seed = 1, + def __init__ (self, + rand_pert = 0.1, + seed = 1, box_scale = 20, nframes = 1): - coord = [[0.0, 0.0, 0.1], [1.1, 0.0, 0.1], [0.0, 1.1, 0.1], + coord = [[0.0, 0.0, 0.1], [1.1, 0.0, 0.1], [0.0, 1.1, 0.1], [4.0, 0.0, 0.0], [5.1, 0.0, 0.0], [4.0, 1.1, 0.0]] self.nframes = nframes self.coord = np.array(coord) @@ -90,27 +97,27 @@ def __init__ (self, self.cell = self._copy_nframes(self.cell) self.coord = self.coord.reshape([self.nframes, -1]) self.cell = self.cell.reshape([self.nframes, -1]) - self.natoms = len(self.atype) + self.natoms = len(self.atype) self.idx_map = np.lexsort ((np.arange(self.natoms), self.atype)) self.coord = self.coord.reshape([self.nframes, -1, 3]) self.coord = self.coord[:,self.idx_map,:] - self.coord = self.coord.reshape([self.nframes, -1]) + self.coord = self.coord.reshape([self.nframes, -1]) self.efield = dp_random.random(self.coord.shape) self.atype = self.atype[self.idx_map] self.datype = self._copy_nframes(self.atype) def _copy_nframes(self, xx): return np.tile(xx, [self.nframes, 1]) - + def get_data(self) : return self.coord, self.cell, self.datype def get_natoms (self) : ret = [self.natoms, self.natoms] for ii in range(max(self.atype) + 1) : - ret.append(np.sum(self.atype == ii)) + ret.append(np.sum(self.atype == ii)) return np.array(ret, dtype = np.int32) - + def get_ntypes(self) : return max(self.atype) + 1 @@ -149,7 +156,7 @@ def get_ntypes(self) : # return nc, nb, nt def get_test_box_data (self, - hh, + hh, rand_pert = 0.1) : coord0_, box0_, type0_ = self.get_data() coord = coord0_[0] @@ -162,7 +169,7 @@ def get_test_box_data (self, rbox3 = np.linalg.inv(box3) coord3 = np.reshape(coord, [nframes, natoms, 3]) rcoord3 = np.matmul(coord3, rbox3) - + all_coord = [coord.reshape([nframes, natoms*3])] all_box = [box.reshape([nframes,9])] all_atype = [atype] @@ -189,15 +196,15 @@ def get_test_box_data (self, all_efield.append(self.efield) all_coord = np.reshape(all_coord, [-1, natoms * 3]) all_box = np.reshape(all_box, [-1, 9]) - all_atype = np.reshape(all_atype, [-1, natoms]) - all_efield = np.reshape(all_efield, [-1, natoms * 3]) + all_atype = np.reshape(all_atype, [-1, natoms]) + all_efield = np.reshape(all_efield, [-1, natoms * 3]) return all_coord, all_box, all_atype, all_efield -def force_test (inter, - testCase, - places = global_default_places, - hh = global_default_fv_hh, +def force_test (inter, + testCase, + places = global_default_places, + hh = global_default_fv_hh, suffix = '') : # set weights w0 = np.ones (inter.ndescrpt) @@ -210,7 +217,7 @@ def force_test (inter, dcoord, dbox, dtype = inter.data.get_data () defield = inter.data.efield # cmp e0, f0 - [energy, force] = inter.sess.run ([t_energy, t_force], + [energy, force] = inter.sess.run ([t_energy, t_force], feed_dict = { inter.coord: dcoord, inter.box: dbox, @@ -219,14 +226,14 @@ def force_test (inter, inter.tnatoms: inter.natoms} ) # dim force - sel_idx = np.arange(inter.natoms[0]) + sel_idx = np.arange(inter.natoms[0]) for idx in sel_idx: for dd in range(3): dcoordp = np.copy(dcoord) dcoordm = np.copy(dcoord) dcoordp[0,idx*3+dd] = dcoord[0,idx*3+dd] + hh dcoordm[0,idx*3+dd] = dcoord[0,idx*3+dd] - hh - [enerp] = inter.sess.run ([t_energy], + [enerp] = inter.sess.run ([t_energy], feed_dict = { inter.coord: dcoordp, inter.box: dbox, @@ -234,7 +241,7 @@ def force_test (inter, inter.efield: defield, inter.tnatoms: inter.natoms} ) - [enerm] = inter.sess.run ([t_energy], + [enerm] = inter.sess.run ([t_energy], feed_dict = { inter.coord: dcoordm, inter.box: dbox, @@ -243,17 +250,17 @@ def force_test (inter, inter.tnatoms: inter.natoms} ) c_force = -(enerp[0] - enerm[0]) / (2*hh) - testCase.assertAlmostEqual(c_force, force[0,idx*3+dd], + testCase.assertAlmostEqual(c_force, force[0,idx*3+dd], places = places, msg = "force component [%d,%d] failed" % (idx, dd)) -def comp_vol (box) : +def comp_vol (box) : return np.linalg.det (np.reshape(box, (3,3))) -def virial_test (inter, - testCase, - places = global_default_places, - hh = global_default_fv_hh, +def virial_test (inter, + testCase, + places = global_default_places, + hh = global_default_fv_hh, suffix = '') : # set weights w0 = np.ones (inter.ndescrpt) @@ -266,7 +273,7 @@ def virial_test (inter, dcoord, dbox, dtype, defield = inter.data.get_test_box_data(hh) # cmp e, f, v [energy, force, virial] \ - = inter.sess.run ([t_energy, t_force, t_virial], + = inter.sess.run ([t_energy, t_force, t_virial], feed_dict = { inter.coord: dcoord, inter.box: dbox, @@ -281,19 +288,19 @@ def virial_test (inter, ep = energy[1+(ii*3+jj)*2+0] em = energy[1+(ii*3+jj)*2+1] num_vir[ii][jj] = -(ep - em) / (2.*hh) - num_vir = np.transpose(num_vir, [1,0]) + num_vir = np.transpose(num_vir, [1,0]) box3 = dbox[0].reshape([3,3]) num_vir = np.matmul(num_vir, box3) np.testing.assert_almost_equal(ana_vir, num_vir, - places, + places, err_msg = 'virial component') - -def force_dw_test (inter, + +def force_dw_test (inter, testCase, places = global_default_places, - hh = global_default_dw_hh, + hh = global_default_dw_hh, suffix = '') : dcoord, dbox, dtype = inter.data.get_data() defield = inter.data.efield @@ -306,15 +313,15 @@ def force_dw_test (inter, w0 = np.ones (inter.ndescrpt) inter.net_w_i = np.copy(w0) - + t_ll, t_dw = inter.comp_f_dw (inter.coord, inter.box, inter.type, inter.tnatoms, name = "f_dw_test_0" + suffix) inter.sess.run (tf.global_variables_initializer()) ll_0 = inter.sess.run (t_ll, feed_dict = feed_dict_test0) dw_0 = inter.sess.run (t_dw, feed_dict = feed_dict_test0) - + absolut_e = [] relativ_e = [] - test_list = range (inter.ndescrpt) + test_list = range (inter.ndescrpt) ntest = 3 if inter.sel_a[0] != 0: test_list = np.concatenate((np.arange(0,ntest), np.arange(inter.sel_a[0]*4, inter.sel_a[0]*4+ntest))) @@ -338,10 +345,10 @@ def force_dw_test (inter, testCase.assertAlmostEqual(num_v, ana_v, places = places) -def virial_dw_test (inter, +def virial_dw_test (inter, testCase, places = global_default_places, - hh = global_default_dw_hh, + hh = global_default_dw_hh, suffix = '') : dcoord, dbox, dtype = inter.data.get_data() defield = inter.data.efield @@ -359,16 +366,16 @@ def virial_dw_test (inter, inter.sess.run (tf.global_variables_initializer()) ll_0 = inter.sess.run (t_ll, feed_dict = feed_dict_test0) dw_0 = inter.sess.run (t_dw, feed_dict = feed_dict_test0) - + absolut_e = [] relativ_e = [] - test_list = range (inter.ndescrpt) + test_list = range (inter.ndescrpt) ntest = 3 if inter.sel_a[0] != 0 : test_list = np.concatenate((np.arange(0,ntest), np.arange(inter.sel_a[0]*4, inter.sel_a[0]*4+ntest))) else : test_list = np.arange(0,ntest) - + for ii in test_list: inter.net_w_i = np.copy (w0) inter.net_w_i[ii] += hh diff --git a/source/tests/test_data_large_batch.py b/source/tests/test_data_large_batch.py index 084c890280..f84aaeedf6 100644 --- a/source/tests/test_data_large_batch.py +++ b/source/tests/test_data_large_batch.py @@ -11,27 +11,27 @@ from deepmd.model import EnerModel from deepmd.utils.type_embed import TypeEmbedNet from deepmd.common import j_must_have +from common import tf +from packaging.version import parse as parse_version GLOBAL_ENER_FLOAT_PRECISION = tf.float64 GLOBAL_TF_FLOAT_PRECISION = tf.float64 GLOBAL_NP_FLOAT_PRECISION = np.float64 +@unittest.skipIf(parse_version(tf.__version__) < parse_version("1.15"), + f"The current tf version {tf.__version__} is too low to run the new testing model.") class TestDataLargeBatch(tf.test.TestCase): def setUp(self): - gen_data(large_batch_mode=True) + gen_data(mixed_type=True) - def test_data_large_batch(self): - jfile = 'water_se_atten_large_batch.json' + def test_data_mixed_type(self): + jfile = 'water_se_atten_mixed_type.json' jdata = j_loader(jfile) systems = j_must_have(jdata, 'systems') - set_pfx = j_must_have(jdata, 'set_prefix') - batch_size = j_must_have(jdata, 'batch_size') - test_size = j_must_have(jdata, 'numb_test') batch_size = 1 test_size = 1 - stop_batch = j_must_have(jdata, 'stop_batch') rcut = j_must_have(jdata['model']['descriptor'], 'rcut') data = DeepmdDataSystem(systems, batch_size, test_size, rcut) @@ -84,9 +84,9 @@ def test_data_large_batch(self): typeebd = TypeEmbedNet( neuron=typeebd_param['neuron'], resnet_dt=typeebd_param['resnet_dt'], + activation_function=None, seed=typeebd_param['seed'], uniform_seed=True, - use_linear=True, padding=True) model = EnerModel(descrpt, fitting, typeebd) @@ -98,7 +98,7 @@ def test_data_large_batch(self): 'default_mesh': [test_data['default_mesh']], 'real_natoms_vec': [test_data['real_natoms_vec']] } - model._compute_input_stat(input_data, large_batch_mode=True) + model._compute_input_stat(input_data, mixed_type=True) model.descrpt.bias_atom_e = np.array([0., 0.]) t_energy = tf.placeholder(GLOBAL_ENER_FLOAT_PRECISION, [None], name='t_energy') diff --git a/source/tests/test_descrpt_se_atten.py b/source/tests/test_descrpt_se_atten.py index 6523766bb8..777ba0e6bc 100644 --- a/source/tests/test_descrpt_se_atten.py +++ b/source/tests/test_descrpt_se_atten.py @@ -10,12 +10,16 @@ from deepmd.model import EnerModel from deepmd.common import j_must_have from deepmd.utils.type_embed import embed_atom_type, TypeEmbedNet +from common import tf +from packaging.version import parse as parse_version GLOBAL_ENER_FLOAT_PRECISION = tf.float64 GLOBAL_TF_FLOAT_PRECISION = tf.float64 GLOBAL_NP_FLOAT_PRECISION = np.float64 +@unittest.skipIf(parse_version(tf.__version__) < parse_version("1.15"), + f"The current tf version {tf.__version__} is too low to run the new testing model.") class TestModel(tf.test.TestCase): def setUp(self): gen_data(nframes=2) @@ -43,7 +47,7 @@ def test_descriptor_two_sides(self): # set parameters jdata['model']['descriptor']['neuron'] = [5, 5, 5] jdata['model']['descriptor']['axis_neuron'] = 2 - typeebd_param = {'neuron': [5, 5, 5], + typeebd_param = {'neuron': [5], 'resnet_dt': False, 'seed': 1, } @@ -51,10 +55,10 @@ def test_descriptor_two_sides(self): # init models typeebd = TypeEmbedNet( neuron=typeebd_param['neuron'], + activation_function=None, resnet_dt=typeebd_param['resnet_dt'], seed=typeebd_param['seed'], uniform_seed=True, - use_linear=True, padding=True ) @@ -86,7 +90,7 @@ def test_descriptor_two_sides(self): type_embedding = typeebd.build( ntypes, - suffix="_se_a_type_des_ebd_2sdies" + suffix="_se_atten_type_des_ebd_2sdies" ) dout \ @@ -98,7 +102,7 @@ def test_descriptor_two_sides(self): t_mesh, {'type_embedding': type_embedding}, reuse=False, - suffix="_se_a_type_des_2sides" + suffix="_se_atten_type_des_2sides" ) feed_dict_test = {t_prop_c: test_data['prop_c'], @@ -155,7 +159,7 @@ def test_descriptor_one_side(self): jdata['model']['descriptor']['neuron'] = [5, 5, 5] jdata['model']['descriptor']['axis_neuron'] = 2 jdata['model']['descriptor']['type_one_side'] = True - typeebd_param = {'neuron': [5, 5, 5], + typeebd_param = {'neuron': [5], 'resnet_dt': False, 'seed': 1, } @@ -163,10 +167,10 @@ def test_descriptor_one_side(self): # init models typeebd = TypeEmbedNet( neuron=typeebd_param['neuron'], + activation_function=None, resnet_dt=typeebd_param['resnet_dt'], seed=typeebd_param['seed'], uniform_seed=True, - use_linear=True, padding=True ) @@ -198,7 +202,7 @@ def test_descriptor_one_side(self): type_embedding = typeebd.build( ntypes, - suffix="_se_a_type_des_ebd_1side" + suffix="_se_atten_type_des_ebd_1side" ) dout \ @@ -210,7 +214,7 @@ def test_descriptor_one_side(self): t_mesh, {'type_embedding': type_embedding}, reuse=False, - suffix="_se_a_type_des_1side" + suffix="_se_atten_type_des_1side" ) feed_dict_test = {t_prop_c: test_data['prop_c'], diff --git a/source/tests/test_examples.py b/source/tests/test_examples.py index 9bcbc2b3d7..61e1801345 100644 --- a/source/tests/test_examples.py +++ b/source/tests/test_examples.py @@ -17,6 +17,7 @@ p_examples / "water" / "se_e3" / "input.json", p_examples / "water" / "se_e2_a_tebd" / "input.json", p_examples / "water" / "se_e2_a_mixed_prec" / "input.json", + p_examples / "water" / "se_atten" / "input.json", p_examples / "water" / "dplr" / "train" / "dw.json", p_examples / "water" / "dplr" / "train" / "ener.json", p_examples / "nopbc" / "train" / "input.json", diff --git a/source/tests/test_fitting_ener_type.py b/source/tests/test_fitting_ener_type.py index 1eb1002147..5ccb4797ab 100644 --- a/source/tests/test_fitting_ener_type.py +++ b/source/tests/test_fitting_ener_type.py @@ -76,14 +76,17 @@ def test_fitting(self): 0.0005154794374703516,-0.00019422534512034776,-0.00019422534512034776,7.318151797939947e-05,-0.0013576642997136488,0.0005115548790018505,-0.0010275333676074971,0.00038716440070070385,0.0005376426714609369,-0.00020257810468163985, 0.0004482204892297628,-0.00016887749501640607,-0.00016887749501640607,6.364643102775375e-05,-0.001181345877677835,0.0004452029242063362,-0.0008941636427724908,0.0003369586197174627,0.0004677878512312651,-0.00017625260641095753]) type_embedding = np.array([1.4916816460764615,0.2720153234707013,-2.4385153754181985,-1.8454294510880027,2.874575701113528,1.1225116575801295,0.4204818970813372,-2.3784087249787587,-1.5053748251050598,2.769329403073084]) + atype = np.array([0, 0, 1, 1, 1, 1], dtype=np.int32) dout= dout.reshape([-1,10]) type_embedding = type_embedding.reshape([ntypes,-1]) + atype = atype.reshape([-1]) atom_ener = fitting.build(tf.convert_to_tensor(dout), t_natoms, - {'type_embedding':tf.convert_to_tensor(type_embedding)}, - reuse = False, - suffix = "se_a_type_fit_") + {'type_embedding':tf.convert_to_tensor(type_embedding), + 'atype':tf.convert_to_tensor(atype)}, + reuse=False, + suffix="se_a_type_fit_") feed_dict_test = {t_prop_c: test_data['prop_c'], t_energy: test_data['energy'] [:numb_test], diff --git a/source/tests/test_model_se_atten.py b/source/tests/test_model_se_atten.py index 9ae73f8a1c..d8bce857b0 100644 --- a/source/tests/test_model_se_atten.py +++ b/source/tests/test_model_se_atten.py @@ -10,12 +10,16 @@ from deepmd.model import EnerModel from deepmd.utils.type_embed import TypeEmbedNet from deepmd.common import j_must_have +from common import tf +from packaging.version import parse as parse_version GLOBAL_ENER_FLOAT_PRECISION = tf.float64 GLOBAL_TF_FLOAT_PRECISION = tf.float64 GLOBAL_NP_FLOAT_PRECISION = np.float64 +@unittest.skipIf(parse_version(tf.__version__) < parse_version("1.15"), + f"The current tf version {tf.__version__} is too low to run the new testing model.") class TestModel(tf.test.TestCase): def setUp(self): gen_data() @@ -46,10 +50,10 @@ def test_model(self): typeebd_param = jdata['model']['type_embedding'] typeebd = TypeEmbedNet( neuron=typeebd_param['neuron'], + activation_function=None, resnet_dt=typeebd_param['resnet_dt'], seed=typeebd_param['seed'], uniform_seed=True, - use_linear=True, padding=True) model = EnerModel(descrpt, fitting, typeebd) diff --git a/source/tests/water_se_atten.json b/source/tests/water_se_atten.json index 07d910e6b5..1a1e02c11c 100644 --- a/source/tests/water_se_atten.json +++ b/source/tests/water_se_atten.json @@ -3,7 +3,7 @@ "model" : { "type_map": ["O", "H"], "type_embedding":{ - "neuron": [2,4,8], + "neuron": [8], "resnet_dt": false, "seed": 1 }, diff --git a/source/tests/water_se_atten_large_batch.json b/source/tests/water_se_atten_mixed_type.json similarity index 95% rename from source/tests/water_se_atten_large_batch.json rename to source/tests/water_se_atten_mixed_type.json index a0664d7b4e..e83e7c3f39 100644 --- a/source/tests/water_se_atten_large_batch.json +++ b/source/tests/water_se_atten_mixed_type.json @@ -3,7 +3,7 @@ "model" : { "type_map": ["O", "H"], "type_embedding":{ - "neuron": [2,4,8], + "neuron": [8], "resnet_dt": false, "seed": 1 }, @@ -31,7 +31,7 @@ "_comment": " traing controls", - "systems": ["system_large_batch"], + "systems": ["system_mixed_type"], "set_prefix": "set", "stop_batch": 1000000, "batch_size": 1, From 9203f02f57967962f27e508cbc4bf5b845f832c1 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Tue, 23 Aug 2022 23:58:56 +0800 Subject: [PATCH 15/23] Fix typo in data_system.py --- deepmd/utils/data_system.py | 1 - 1 file changed, 1 deletion(-) diff --git a/deepmd/utils/data_system.py b/deepmd/utils/data_system.py index 15eb6f91fc..bcaeada1ee 100644 --- a/deepmd/utils/data_system.py +++ b/deepmd/utils/data_system.py @@ -10,7 +10,6 @@ from deepmd.utils import random as dp_random from deepmd.utils.data import DataSets from deepmd.utils.data import DeepmdData -from IPython import embed log = logging.getLogger(__name__) From a54524f8827fdb9177a4f9f22552713ddcd459af Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Wed, 24 Aug 2022 00:35:27 +0800 Subject: [PATCH 16/23] Add docs in toc --- README.md | 1 + doc/model/index.md | 1 + doc/model/index.rst | 1 + source/lib/src/cuda/neighbor_list.cu | 4 ++-- source/lib/src/neighbor_list.cc | 8 ++++---- source/lib/src/rocm/neighbor_list.hip.cu | 4 ++-- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 357ff43fba..6f72f21c14 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ A full [document](doc/train/train-input-auto.rst) on options in the training inp - [Descriptor `"se_e2_a"`](doc/model/train-se-e2-a.md) - [Descriptor `"se_e2_r"`](doc/model/train-se-e2-r.md) - [Descriptor `"se_e3"`](doc/model/train-se-e3.md) + - [Descriptor `"se_atten"`](doc/model/train-se-atten.md) - [Descriptor `"hybrid"`](doc/model/train-hybrid.md) - [Descriptor `sel`](doc/model/sel.md) - [Fit energy](doc/model/train-energy.md) diff --git a/doc/model/index.md b/doc/model/index.md index 12df4e22f3..7b58d09ef8 100644 --- a/doc/model/index.md +++ b/doc/model/index.md @@ -4,6 +4,7 @@ - [Descriptor `"se_e2_a"`](train-se-e2-a.md) - [Descriptor `"se_e2_r"`](train-se-e2-r.md) - [Descriptor `"se_e3"`](train-se-e3.md) +- [Descriptor `"se_atten"`](train-se-atten.md) - [Descriptor `"hybrid"`](train-hybrid.md) - [Descriptor `sel`](sel.md) - [Fit energy](train-energy.md) diff --git a/doc/model/index.rst b/doc/model/index.rst index 6177452342..fab6673495 100644 --- a/doc/model/index.rst +++ b/doc/model/index.rst @@ -8,6 +8,7 @@ Model train-se-e2-a train-se-e2-r train-se-e3 + train-se-atten train-hybrid sel train-energy diff --git a/source/lib/src/cuda/neighbor_list.cu b/source/lib/src/cuda/neighbor_list.cu index eb4466786b..1831edcdea 100644 --- a/source/lib/src/cuda/neighbor_list.cu +++ b/source/lib/src/cuda/neighbor_list.cu @@ -166,7 +166,7 @@ __global__ void map_nei_info( temp=nlist_map[nlist_item]; nlist[nlist_idx]=temp; ntype[nlist_idx]=type[temp]; - nmask[nlist_idx]=1.; + nmask[nlist_idx]=(FPTYPE)1.; } else{ ntype[nlist_idx]=ntypes; @@ -191,7 +191,7 @@ __global__ void map_nei_info_noconvert( int nlist_item=nlist[nlist_idx]; if(nlist_item!=-1){ ntype[nlist_idx]=type[nlist_item]; - nmask[nlist_idx]=1.; + nmask[nlist_idx]=(FPTYPE)1.; } else{ ntype[nlist_idx]=ntypes; diff --git a/source/lib/src/neighbor_list.cc b/source/lib/src/neighbor_list.cc index 7d9c3a0552..9f66f61a65 100644 --- a/source/lib/src/neighbor_list.cc +++ b/source/lib/src/neighbor_list.cc @@ -843,11 +843,11 @@ use_nei_info_cpu( int temp = nlist_map[record]; nlist[nlist_idx] = temp; ntype[nlist_idx]=type[temp]; - nmask[nlist_idx]=1.; + nmask[nlist_idx]=(FPTYPE)1.; } else{ ntype[nlist_idx]=ntypes; - nmask[nlist_idx]=0.; + nmask[nlist_idx]=(FPTYPE)0.; } } } @@ -859,11 +859,11 @@ use_nei_info_cpu( int record = nlist[nlist_idx]; if (record >= 0){ ntype[nlist_idx]=type[record]; - nmask[nlist_idx]=1.; + nmask[nlist_idx]=(FPTYPE)1.; } else{ ntype[nlist_idx]=ntypes; - nmask[nlist_idx]=0.; + nmask[nlist_idx]=(FPTYPE)0.; } } } diff --git a/source/lib/src/rocm/neighbor_list.hip.cu b/source/lib/src/rocm/neighbor_list.hip.cu index eaf35f4812..f3abcfdcc5 100644 --- a/source/lib/src/rocm/neighbor_list.hip.cu +++ b/source/lib/src/rocm/neighbor_list.hip.cu @@ -166,7 +166,7 @@ __global__ void map_nei_info( temp=nlist_map[nlist_item]; nlist[nlist_idx]=temp; ntype[nlist_idx]=type[temp]; - nmask[nlist_idx]=1.; + nmask[nlist_idx]=(FPTYPE)1.; } else{ ntype[nlist_idx]=ntypes; @@ -191,7 +191,7 @@ __global__ void map_nei_info_noconvert( int nlist_item=nlist[nlist_idx]; if(nlist_item!=-1){ ntype[nlist_idx]=type[nlist_item]; - nmask[nlist_idx]=1.; + nmask[nlist_idx]=(FPTYPE)1.; } else{ ntype[nlist_idx]=ntypes; From 56e03863917795c63e0efb725a031c9ec698f348 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Wed, 24 Aug 2022 15:37:04 +0800 Subject: [PATCH 17/23] Add docs to ntype and nmask Add docs to ntype and nmask in ProdEnvMatAMix. Change nmask from FPTYPE to bool. Fix bugs in toc depth. --- deepmd/descriptor/se_atten.py | 2 +- deepmd/utils/argcheck.py | 2 +- deepmd/utils/network.py | 2 +- doc/model/train-se-atten.md | 18 ++++---- source/lib/include/neighbor_list.h | 9 ++-- source/lib/src/cuda/neighbor_list.cu | 17 +++---- source/lib/src/neighbor_list.cc | 39 ++-------------- source/lib/src/rocm/neighbor_list.hip.cu | 15 ++---- source/lib/tests/test_env_mat_a_mix.cc | 59 +++++++++++++----------- source/op/prod_env_mat_multi_device.cc | 33 +++++++------ 10 files changed, 83 insertions(+), 113 deletions(-) diff --git a/deepmd/descriptor/se_atten.py b/deepmd/descriptor/se_atten.py index 8e91062e0c..ead4f93d46 100644 --- a/deepmd/descriptor/se_atten.py +++ b/deepmd/descriptor/se_atten.py @@ -324,7 +324,7 @@ def build(self, sel_a=self.sel_all_a, sel_r=self.sel_all_r) self.nei_type_vec = tf.reshape(self.nei_type_vec, [-1]) - self.nmask = tf.reshape(self.nmask, [-1, 1, self.sel_all_a[0]]) + self.nmask = tf.cast(tf.reshape(self.nmask, [-1, 1, self.sel_all_a[0]]), GLOBAL_TF_FLOAT_PRECISION) self.negative_mask = -(2 << 32) * (1.0 - self.nmask) # only used when tensorboard was set as true tf.summary.histogram('descrpt', self.descrpt) diff --git a/deepmd/utils/argcheck.py b/deepmd/utils/argcheck.py index e5df77ad26..2727f8d0b2 100644 --- a/deepmd/utils/argcheck.py +++ b/deepmd/utils/argcheck.py @@ -250,7 +250,7 @@ def descrpt_se_atten_args(): doc_axis_neuron = 'Size of the submatrix of G (embedding matrix).' doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' - doc_type_one_side = 'Try to build N_types embedding nets. Otherwise, building N_types^2 embedding nets' + doc_type_one_side = 'Whether to consider the information from only one side or both sides.' doc_precision = f'The precision of the embedding net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' doc_trainable = 'If the parameters in the embedding net is trainable' doc_seed = 'Random seed for parameter initialization' diff --git a/deepmd/utils/network.py b/deepmd/utils/network.py index 20a9070039..22542adfba 100644 --- a/deepmd/utils/network.py +++ b/deepmd/utils/network.py @@ -204,7 +204,7 @@ def embedding_net(xx, xx = tf.cast(xx, get_precision(mixed_prec['compute_prec'])) w = tf.cast(w, get_precision(mixed_prec['compute_prec'])) b = tf.cast(b, get_precision(mixed_prec['compute_prec'])) - if activation_fn != None: + if activation_fn is not None: hidden = tf.reshape(activation_fn(tf.nn.bias_add(tf.matmul(xx, w), b)), [-1, outputs_size[ii]]) else: hidden = tf.reshape(tf.nn.bias_add(tf.matmul(xx, w), b), [-1, outputs_size[ii]]) diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md index d16b79ecbe..dbc470005b 100644 --- a/doc/model/train-se-atten.md +++ b/doc/model/train-se-atten.md @@ -1,4 +1,6 @@ -# DPA-1: Pretraining of Attention-based Deep Potential Model for Molecular Simulation +# Descriptor `"se_atten"` + +## DPA-1: Pretraining of Attention-based Deep Potential Model for Molecular Simulation ![ALT](../images/model_se_atten.png "model_se_atten") @@ -6,14 +8,14 @@ Here we propose DPA-1, a Deep Potential model with a novel attention mechanism, See [this paper](https://arxiv.org/abs/2208.08236) for more information. DPA-1 is implemented as a new descriptor `"se_atten"` for model training, which can be used after simply editing the input.json. -# Installation +## Installation Follow the [standard installation](../install/install-from-source.md#install-the-python-interface) of python interface in DeePMD-kit. After that, you can smoothly use the DPA-1 model with following instructions. -# Introduction to new features of DPA-1 +## Introduction to new features of DPA-1 Next we will list the detail settings in input.json and the data format, especially for large systems with dozens of elements. An example of DPA-1 input can be found in [here](../../examples/water/se_atten/input.json). -## Descriptor `"se_atten"` +### Descriptor `"se_atten"` The notation of `se_atten` is short for the smooth edition of Deep Potential with an attention mechanism. This descriptor was described in detail in [the DPA-1 paper](https://arxiv.org/abs/2208.08236) and the images above. @@ -53,10 +55,10 @@ An example of the DPA-1 descriptor is provided as follows * {ref}`attn_mask ` determines whether to mask the diagonal in the attention weights and False is recommended. * {ref}`attn_dotr ` determines whether to dot the relative coordinates on the attention weights as a gated scheme, True is recommended. -## Fitting `"ener"` +### Fitting `"ener"` DPA-1 only support `"ener"` fitting type, and you can refer [here](train-energy.md) for detail information. -## Type embedding +### Type embedding DPA-1 only support models with type embeddings on. And the default setting is as follows: ```json "type_embedding":{ @@ -68,7 +70,7 @@ DPA-1 only support models with type embeddings on. And the default setting is as You can add these settings in input.json if you want to change the default ones, see [here](train-se-e2-a-tebd.md) for detail information. -## Type map +### Type map For training a large systems, especially those with dozens of elements, the {ref}`type ` determines the element index of training data: ```json "type_map": [ @@ -109,7 +111,7 @@ With these edited files, one can put together frames with the same `Natoms`, ins The API to generate or transfer to `mixed_type` format will be uploaded on [dpdata](https://github.com/deepmodeling/dpdata) soon for a more convenient experience. -# Training example +## Training example Here we upload the AlMgCu example showed in the paper, you can download here: [Baidu disk](https://pan.baidu.com/s/1Mk9CihPHCmf8quwaMhT-nA?pwd=d586); [Google disk](https://drive.google.com/file/d/11baEpRrvHoqxORFPSdJiGWusb3Y4AnRE/view?usp=sharing). diff --git a/source/lib/include/neighbor_list.h b/source/lib/include/neighbor_list.h index 13c0a40e1f..0155715cdc 100644 --- a/source/lib/include/neighbor_list.h +++ b/source/lib/include/neighbor_list.h @@ -85,11 +85,10 @@ build_nlist_cpu( const int & mem_size, const float & rcut); -template void use_nei_info_cpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, @@ -152,11 +151,10 @@ build_nlist_gpu( const int & mem_size, const float & rcut); -template void use_nei_info_gpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, @@ -191,11 +189,10 @@ build_nlist_gpu_rocm( const int & mem_size, const float & rcut); -template void use_nei_info_gpu_rocm( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, diff --git a/source/lib/src/cuda/neighbor_list.cu b/source/lib/src/cuda/neighbor_list.cu index 1831edcdea..3089ab956b 100644 --- a/source/lib/src/cuda/neighbor_list.cu +++ b/source/lib/src/cuda/neighbor_list.cu @@ -144,11 +144,10 @@ __global__ void map_nlist( } } -template __global__ void map_nei_info( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, @@ -166,18 +165,17 @@ __global__ void map_nei_info( temp=nlist_map[nlist_item]; nlist[nlist_idx]=temp; ntype[nlist_idx]=type[temp]; - nmask[nlist_idx]=(FPTYPE)1.; + nmask[nlist_idx]=true; } else{ ntype[nlist_idx]=ntypes; } } -template __global__ void map_nei_info_noconvert( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int nloc, const int nnei, @@ -191,7 +189,7 @@ __global__ void map_nei_info_noconvert( int nlist_item=nlist[nlist_idx]; if(nlist_item!=-1){ ntype[nlist_idx]=type[nlist_item]; - nmask[nlist_idx]=(FPTYPE)1.; + nmask[nlist_idx]=true; } else{ ntype[nlist_idx]=ntypes; @@ -274,11 +272,10 @@ void use_nlist_map( DPErrcheck(cudaDeviceSynchronize()); } -template void use_nei_info_gpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, @@ -290,7 +287,7 @@ void use_nei_info_gpu( dim3 block_grid(nloc, nblock); dim3 thread_grid(1, TPB); DPErrcheck(cudaMemset(ntype, 0, sizeof(int) * nloc * nnei)); - DPErrcheck(cudaMemset(nmask, 0, sizeof(FPTYPE) * nloc * nnei)); + DPErrcheck(cudaMemset(nmask, 0, sizeof(bool) * nloc * nnei)); if (b_nlist_map){ map_nei_info<<>>(nlist, ntype, nmask, type, nlist_map, nloc, nnei, ntypes); } @@ -303,6 +300,4 @@ void use_nei_info_gpu( template int build_nlist_gpu(InputNlist & nlist, int * max_list_size, int * nlist_data, const float * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); template int build_nlist_gpu(InputNlist & nlist, int * max_list_size, int * nlist_data, const double * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); -template void use_nei_info_gpu(int * nlist, int * ntype, float * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); -template void use_nei_info_gpu(int * nlist, int * ntype, double * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); } \ No newline at end of file diff --git a/source/lib/src/neighbor_list.cc b/source/lib/src/neighbor_list.cc index 9f66f61a65..99362bcc08 100644 --- a/source/lib/src/neighbor_list.cc +++ b/source/lib/src/neighbor_list.cc @@ -820,13 +820,12 @@ build_nlist_cpu( return 0; } -template void deepmd:: use_nei_info_cpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, @@ -843,11 +842,11 @@ use_nei_info_cpu( int temp = nlist_map[record]; nlist[nlist_idx] = temp; ntype[nlist_idx]=type[temp]; - nmask[nlist_idx]=(FPTYPE)1.; + nmask[nlist_idx]=true; } else{ ntype[nlist_idx]=ntypes; - nmask[nlist_idx]=(FPTYPE)0.; + nmask[nlist_idx]=false; } } } @@ -859,11 +858,11 @@ use_nei_info_cpu( int record = nlist[nlist_idx]; if (record >= 0){ ntype[nlist_idx]=type[record]; - nmask[nlist_idx]=(FPTYPE)1.; + nmask[nlist_idx]=true; } else{ ntype[nlist_idx]=ntypes; - nmask[nlist_idx]=(FPTYPE)0.; + nmask[nlist_idx]=false; } } } @@ -894,34 +893,6 @@ build_nlist_cpu( const int & mem_size, const float & rcut); -template -void -deepmd:: -use_nei_info_cpu( - int * nlist, - int * ntype, - double * nmask, - const int * type, - const int * nlist_map, - const int nloc, - const int nnei, - const int ntypes, - const bool b_nlist_map); - -template -void -deepmd:: -use_nei_info_cpu( - int * nlist, - int * ntype, - float * nmask, - const int * type, - const int * nlist_map, - const int nloc, - const int nnei, - const int ntypes, - const bool b_nlist_map); - #if GOOGLE_CUDA || TENSORFLOW_USE_ROCM void deepmd::convert_nlist_gpu_device( InputNlist & gpu_nlist, diff --git a/source/lib/src/rocm/neighbor_list.hip.cu b/source/lib/src/rocm/neighbor_list.hip.cu index f3abcfdcc5..3bdfbee770 100644 --- a/source/lib/src/rocm/neighbor_list.hip.cu +++ b/source/lib/src/rocm/neighbor_list.hip.cu @@ -144,11 +144,10 @@ __global__ void map_nlist( } } -template __global__ void map_nei_info( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, @@ -166,18 +165,17 @@ __global__ void map_nei_info( temp=nlist_map[nlist_item]; nlist[nlist_idx]=temp; ntype[nlist_idx]=type[temp]; - nmask[nlist_idx]=(FPTYPE)1.; + nmask[nlist_idx]=true; } else{ ntype[nlist_idx]=ntypes; } } -template __global__ void map_nei_info_noconvert( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int nloc, const int nnei, @@ -191,7 +189,7 @@ __global__ void map_nei_info_noconvert( int nlist_item=nlist[nlist_idx]; if(nlist_item!=-1){ ntype[nlist_idx]=type[nlist_item]; - nmask[nlist_idx]=(FPTYPE)1.; + nmask[nlist_idx]=true; } else{ ntype[nlist_idx]=ntypes; @@ -275,11 +273,10 @@ void use_nlist_map( DPErrcheck(hipDeviceSynchronize()); } -template void use_nei_info_gpu_rocm( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * nlist_map, const int nloc, @@ -304,6 +301,4 @@ void use_nei_info_gpu_rocm( template int build_nlist_gpu_rocm(InputNlist & nlist, int * max_list_size, int * nlist_data, const float * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); template int build_nlist_gpu_rocm(InputNlist & nlist, int * max_list_size, int * nlist_data, const double * c_cpy, const int & nloc, const int & nall, const int & mem_size, const float & rcut); -template void use_nei_info_gpu_rocm(int * nlist, int * ntype, float * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); -template void use_nei_info_gpu_rocm(int * nlist, int * ntype, double * nmask, const int * type, const int * nlist_map, const int nloc, const int nnei, const int ntypes, const bool b_nlist_map); } \ No newline at end of file diff --git a/source/lib/tests/test_env_mat_a_mix.cc b/source/lib/tests/test_env_mat_a_mix.cc index d056aa1d70..03d01fe01d 100644 --- a/source/lib/tests/test_env_mat_a_mix.cc +++ b/source/lib/tests/test_env_mat_a_mix.cc @@ -52,13 +52,13 @@ class TestEnvMatAMix : public ::testing::Test 0, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, }; - std::vector expected_nmask = { - 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., - 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., + std::vector expected_nmask = { + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; void SetUp() override { @@ -128,13 +128,13 @@ class TestEnvMatAMixShortSel : public ::testing::Test 0, 1, 1, 0, 0, 1, 1, 0, }; - std::vector expected_nmask = { - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1., - 1., 1., 1., 1., + std::vector expected_nmask = { + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, }; void SetUp() override { @@ -440,7 +440,8 @@ TEST_F(TestEnvMatAMix, prod_cpu) std::vector em(nloc * ndescrpt), em_deriv(nloc * ndescrpt * 3), rij(nloc * nnei * 3); std::vector nlist(nloc * nnei); std::vector ntype(nloc * nnei); - std::vector nmask(nloc * nnei); + bool * nmask = new bool [nloc * nnei]; + memset(nmask, 0, sizeof(bool) * nloc * nnei); std::vector avg(ntypes * ndescrpt, 0); std::vector std(ntypes * ndescrpt, 1); deepmd::prod_env_mat_a_cpu( @@ -463,7 +464,7 @@ TEST_F(TestEnvMatAMix, prod_cpu) deepmd::use_nei_info_cpu( &nlist[0], &ntype[0], - &nmask[0], + nmask, &atype[0], &mapping[0], nloc, @@ -479,9 +480,10 @@ TEST_F(TestEnvMatAMix, prod_cpu) 1e-5); } EXPECT_EQ(ntype[ii*nnei+jj], expected_ntype[ii*nnei+jj]); - EXPECT_LT(fabs(nmask[ii*nnei+jj] - expected_nmask[ii*nnei+jj]), 1e-5); + EXPECT_EQ(nmask[ii*nnei+jj], expected_nmask[ii*nnei+jj]); } } + free(nmask); } TEST_F(TestEnvMatAMix, prod_cpu_equal_cpu) @@ -590,11 +592,13 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda) std::vector em(nloc * ndescrpt, 0.0), em_deriv(nloc * ndescrpt * 3, 0.0), rij(nloc * nnei * 3, 0.0); std::vector nlist(nloc * nnei, 0); std::vector ntype(nloc * nnei, 0); - std::vector nmask(nloc * nnei, 0.); + bool * nmask = new bool [nloc * nnei]; + memset(nmask, 0, sizeof(bool) * nloc * nnei); std::vector avg(ntypes * ndescrpt, 0); std::vector std(ntypes * ndescrpt, 1); - double * em_dev = NULL, * em_deriv_dev = NULL, * rij_dev = NULL, * nmask_dev = NULL; + double * em_dev = NULL, * em_deriv_dev = NULL, * rij_dev = NULL; + bool * nmask_dev = NULL; double * posi_cpy_dev = NULL, * avg_dev = NULL, * std_dev = NULL; int * f_atype_cpy_dev = NULL, * atype_dev = NULL, * nlist_dev = NULL, * ntype_dev = NULL, * mapping_dev = NULL, * array_int_dev = NULL, * memory_dev = NULL; uint_64 * array_longlong_dev = NULL; @@ -609,7 +613,7 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda) deepmd::malloc_device_memory_sync(nlist_dev, nlist); deepmd::malloc_device_memory_sync(ntype_dev, ntype); deepmd::malloc_device_memory_sync(mapping_dev, mapping); - deepmd::malloc_device_memory_sync(nmask_dev, nmask); + deepmd::malloc_device_memory_sync(nmask_dev, nmask, nloc * nnei); deepmd::malloc_device_memory(array_int_dev, sec_a.size() + nloc * sec_a.size() + nloc); deepmd::malloc_device_memory(array_longlong_dev, nloc * GPU_MAX_NBOR_SIZE * 2); deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); @@ -647,7 +651,7 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda) true); deepmd::memcpy_device_to_host(em_dev, em); deepmd::memcpy_device_to_host(ntype_dev, ntype); - deepmd::memcpy_device_to_host(nmask_dev, nmask); + deepmd::memcpy_device_to_host(nmask_dev, nmask, nloc * nnei); deepmd::delete_device_memory(em_dev); deepmd::delete_device_memory(em_deriv_dev); deepmd::delete_device_memory(rij_dev); @@ -673,9 +677,10 @@ TEST_F(TestEnvMatAMix, prod_gpu_cuda) 1e-5); } EXPECT_EQ(ntype[ii*nnei+jj], expected_ntype[ii*nnei+jj]); - EXPECT_LT(fabs(nmask[ii*nnei+jj] - expected_nmask[ii*nnei+jj]), 1e-5); + EXPECT_EQ(nmask[ii*nnei+jj], expected_nmask[ii*nnei+jj]); } } + free(nmask); } @@ -833,7 +838,8 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm) std::vector em(nloc * ndescrpt, 0.0), em_deriv(nloc * ndescrpt * 3, 0.0), rij(nloc * nnei * 3, 0.0); std::vector nlist(nloc * nnei, 0); std::vector ntype(nloc * nnei, 0); - std::vector nmask(nloc * nnei, 0.); + bool * nmask = new bool [nloc * nnei]; + memset(nmask, 0, sizeof(bool) * nloc * nnei); std::vector avg(ntypes * ndescrpt, 0); std::vector std(ntypes * ndescrpt, 1); @@ -852,7 +858,7 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm) deepmd::malloc_device_memory_sync(nlist_dev, nlist); deepmd::malloc_device_memory_sync(ntype_dev, ntype); deepmd::malloc_device_memory_sync(mapping_dev, mapping); - deepmd::malloc_device_memory_sync(nmask_dev, nmask); + deepmd::malloc_device_memory_sync(nmask_dev, nmask, nloc * nnei); deepmd::malloc_device_memory(array_int_dev, sec_a.size() + nloc * sec_a.size() + nloc); deepmd::malloc_device_memory(array_longlong_dev, nloc * GPU_MAX_NBOR_SIZE * 2); deepmd::malloc_device_memory(memory_dev, nloc * max_nbor_size); @@ -890,7 +896,7 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm) true); deepmd::memcpy_device_to_host(em_dev, em); deepmd::memcpy_device_to_host(ntype_dev, ntype); - deepmd::memcpy_device_to_host(nmask_dev, nmask); + deepmd::memcpy_device_to_host(nmask_dev, nmask, nloc * nnei); deepmd::delete_device_memory(em_dev); deepmd::delete_device_memory(em_deriv_dev); deepmd::delete_device_memory(rij_dev); @@ -916,9 +922,10 @@ TEST_F(TestEnvMatAMix, prod_gpu_rocm) 1e-5); } EXPECT_EQ(ntype[ii*nnei+jj], expected_ntype[ii*nnei+jj]); - EXPECT_LT(fabs(nmask[ii*nnei+jj] - expected_nmask[ii*nnei+jj]), 1e-5); + EXPECT_EQ(nmask[ii*nnei+jj], expected_nmask[ii*nnei+jj]); } } + free(nmask); } diff --git a/source/op/prod_env_mat_multi_device.cc b/source/op/prod_env_mat_multi_device.cc index ed5ca1b810..4e32904907 100644 --- a/source/op/prod_env_mat_multi_device.cc +++ b/source/op/prod_env_mat_multi_device.cc @@ -166,7 +166,16 @@ REGISTER_OP("ProdEnvMatAMix") .Output("rij: T") .Output("nlist: int32") .Output("ntype: int32") - .Output("nmask: T");; + .Output("nmask: bool") + .Doc(R"(Compute the environment matrix mixing the atom types. +The sorting of neighbor atoms depends not on atom types, but on the distance and index. +The atoms in nlist matrix will gather forward and thus save space for gaps of types in ProdEnvMatA, +resulting in optimized and relative small sel_a. + +The additional outputs are listed as following: +ntype: The corresponding atom types in nlist. +nmask: The atom mask in nlist. +)"); template static int @@ -205,12 +214,11 @@ _map_nlist_cpu( const int & nloc, const int & nnei); -template static void _map_nei_info_cpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * idx_mapping, const int & nloc, @@ -286,12 +294,11 @@ _map_nlist_gpu( const int & nloc, const int & nnei); -template static void _map_nei_info_gpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * idx_mapping, const int & nloc, @@ -373,12 +380,11 @@ _map_nlist_gpu_rocm( const int & nloc, const int & nnei); -template static void _map_nei_info_gpu_rocm( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * idx_mapping, const int & nloc, @@ -1109,7 +1115,7 @@ class ProdEnvMatAMixOp : public OpKernel { FPTYPE * p_rij = rij_tensor->flat().data(); int * p_nlist = nlist_tensor->flat().data(); int * p_ntype = ntype_tensor->flat().data(); - FPTYPE * p_nmask = nmask_tensor->flat().data(); + bool * p_nmask = nmask_tensor->flat().data(); const FPTYPE * p_coord = coord_tensor.flat().data(); const FPTYPE * p_box = box_tensor.flat().data(); const FPTYPE * avg = avg_tensor.flat().data(); @@ -1123,7 +1129,7 @@ class ProdEnvMatAMixOp : public OpKernel { FPTYPE * rij = p_rij + ff*nloc*nnei*3; int * nlist = p_nlist + ff*nloc*nnei; int * ntype = p_ntype + ff*nloc*nnei; - FPTYPE * nmask = p_nmask + ff*nloc*nnei; + bool * nmask = p_nmask + ff*nloc*nnei; const FPTYPE * coord = p_coord + ff*nall*3; const FPTYPE * box = p_box + ff*9; const int * type = p_type + ff*nall; @@ -1356,12 +1362,11 @@ _map_nlist_cpu( } } -template static void _map_nei_info_cpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * idx_mapping, const int & nloc, @@ -1571,12 +1576,11 @@ _map_nlist_gpu( deepmd::use_nlist_map(nlist, idx_mapping, nloc, nnei); } -template static void _map_nei_info_gpu( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * idx_mapping, const int & nloc, @@ -1802,12 +1806,11 @@ _map_nlist_gpu_rocm( deepmd::use_nlist_map(nlist, idx_mapping, nloc, nnei); } -template static void _map_nei_info_gpu_rocm( int * nlist, int * ntype, - FPTYPE * nmask, + bool * nmask, const int * type, const int * idx_mapping, const int & nloc, From 6a7718474c431e11ad1f09752a5488b5028fa301 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Wed, 24 Aug 2022 16:44:28 +0800 Subject: [PATCH 18/23] Fix duplicated period in each doc_activation_function --- deepmd/utils/argcheck.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/deepmd/utils/argcheck.py b/deepmd/utils/argcheck.py index 2727f8d0b2..45c28c1d93 100644 --- a/deepmd/utils/argcheck.py +++ b/deepmd/utils/argcheck.py @@ -28,7 +28,7 @@ def type_embedding_args(): doc_neuron = 'Number of neurons in each hidden layers of the embedding net. When two layers are of the same size or one layer is twice as large as the previous layer, a skip connection is built.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_seed = 'Random seed for parameter initialization' - doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_precision = f'The precision of the embedding net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' doc_trainable = 'If the parameters in the embedding net are trainable' @@ -128,7 +128,7 @@ def descrpt_se_a_args(): doc_rcut_smth = 'Where to start smoothing. For example the 1/r term is smoothed from `rcut` to `rcut_smth`' doc_neuron = 'Number of neurons in each hidden layers of the embedding net. When two layers are of the same size or one layer is twice as large as the previous layer, a skip connection is built.' doc_axis_neuron = 'Size of the submatrix of G (embedding matrix).' - doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_type_one_side = 'Try to build N_types embedding nets. Otherwise, building N_types^2 embedding nets' doc_precision = f'The precision of the embedding net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' @@ -162,7 +162,7 @@ def descrpt_se_t_args(): doc_rcut = 'The cut-off radius.' doc_rcut_smth = 'Where to start smoothing. For example the 1/r term is smoothed from `rcut` to `rcut_smth`' doc_neuron = 'Number of neurons in each hidden layers of the embedding net. When two layers are of the same size or one layer is twice as large as the previous layer, a skip connection is built.' - doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_precision = f'The precision of the embedding net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' doc_trainable = 'If the parameters in the embedding net are trainable' @@ -205,7 +205,7 @@ def descrpt_se_r_args(): doc_rcut = 'The cut-off radius.' doc_rcut_smth = 'Where to start smoothing. For example the 1/r term is smoothed from `rcut` to `rcut_smth`' doc_neuron = 'Number of neurons in each hidden layers of the embedding net. When two layers are of the same size or one layer is twice as large as the previous layer, a skip connection is built.' - doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_type_one_side = 'Try to build N_types embedding nets. Otherwise, building N_types^2 embedding nets' doc_precision = f'The precision of the embedding net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' @@ -248,7 +248,7 @@ def descrpt_se_atten_args(): doc_rcut_smth = 'Where to start smoothing. For example the 1/r term is smoothed from `rcut` to `rcut_smth`' doc_neuron = 'Number of neurons in each hidden layers of the embedding net. When two layers are of the same size or one layer is twice as large as the previous layer, a skip connection is built.' doc_axis_neuron = 'Size of the submatrix of G (embedding matrix).' - doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the embedding net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_type_one_side = 'Whether to consider the information from only one side or both sides.' doc_precision = f'The precision of the embedding net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' @@ -306,7 +306,7 @@ def fitting_ener(): doc_numb_fparam = 'The dimension of the frame parameter. If set to >0, file `fparam.npy` should be included to provided the input fparams.' doc_numb_aparam = 'The dimension of the atomic parameter. If set to >0, file `aparam.npy` should be included to provided the input aparams.' doc_neuron = 'The number of neurons in each hidden layers of the fitting net. When two hidden layers are of the same size, a skip connection is built.' - doc_activation_function = f'The activation function in the fitting net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the fitting net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_precision = f'The precision of the fitting net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_trainable = 'Whether the parameters in the fitting net are trainable. This option can be\n\n\ @@ -332,7 +332,7 @@ def fitting_ener(): def fitting_polar(): doc_neuron = 'The number of neurons in each hidden layers of the fitting net. When two hidden layers are of the same size, a skip connection is built.' - doc_activation_function = f'The activation function in the fitting net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the fitting net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_precision = f'The precision of the fitting net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' doc_scale = 'The output of the fitting net (polarizability matrix) will be scaled by ``scale``' @@ -364,7 +364,7 @@ def fitting_polar(): def fitting_dipole(): doc_neuron = 'The number of neurons in each hidden layers of the fitting net. When two hidden layers are of the same size, a skip connection is built.' - doc_activation_function = f'The activation function in the fitting net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())}. Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' + doc_activation_function = f'The activation function in the fitting net. Supported activation functions are {list_to_doc(ACTIVATION_FN_DICT.keys())} Note that "gelu" denotes the custom operator version, and "gelu_tf" denotes the TF standard version.' doc_resnet_dt = 'Whether to use a "Timestep" in the skip connection' doc_precision = f'The precision of the fitting net parameters, supported options are {list_to_doc(PRECISION_DICT.keys())} Default follows the interface precision.' doc_sel_type = 'The atom types for which the atomic dipole will be provided. If not set, all types will be selected.' From 4bbccfe6aaafe6bbdea4d2711707649c6d75e3a2 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Thu, 25 Aug 2022 00:02:32 +0800 Subject: [PATCH 19/23] Optimized mixed_type format Delete the need of 'real_atom_numbs.npy' from both code and doc. Add correct checks for each systems of mix_type format. Add none support in get_activation_func. --- deepmd/common.py | 6 ++++-- deepmd/utils/data.py | 15 +++++++++------ deepmd/utils/data_system.py | 7 ++++++- deepmd/utils/type_embed.py | 9 +++------ doc/model/train-se-atten.md | 12 +++++------- source/tests/common.py | 4 ---- 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/deepmd/common.py b/deepmd/common.py index 1146f291d5..6129011bbc 100644 --- a/deepmd/common.py +++ b/deepmd/common.py @@ -405,8 +405,8 @@ def j_loader(filename: Union[str, Path]) -> Dict[str, Any]: def get_activation_func( - activation_fn: "_ACTIVATION", -) -> Callable[[tf.Tensor], tf.Tensor]: + activation_fn: Union["_ACTIVATION", None], +) -> Union[Callable[[tf.Tensor], tf.Tensor], None]: """Get activation function callable based on string name. Parameters @@ -424,6 +424,8 @@ def get_activation_func( RuntimeError if unknown activation function is specified """ + if activation_fn is None or activation_fn in ['none', 'None']: + return None if activation_fn not in ACTIVATION_FN_DICT: raise RuntimeError(f"{activation_fn} is not a valid activation function") return ACTIVATION_FN_DICT[activation_fn] diff --git a/deepmd/utils/data.py b/deepmd/utils/data.py index b87d53813d..b5faf15c34 100644 --- a/deepmd/utils/data.py +++ b/deepmd/utils/data.py @@ -60,9 +60,12 @@ def __init__ (self, self.pbc = self._check_pbc(root) # enforce type_map if necessary if type_map is not None and self.type_map is not None: - atom_type_ = [type_map.index(self.type_map[ii]) for ii in self.atom_type] - self.atom_type = np.array(atom_type_, dtype = np.int32) + if not self.mixed_type: + atom_type_ = [type_map.index(self.type_map[ii]) for ii in self.atom_type] + self.atom_type = np.array(atom_type_, dtype = np.int32) self.type_map = type_map + if type_map is None and self.type_map is None and self.mixed_type: + raise RuntimeError('mixed_type format must have type_map!') # make idx map self.idx_map = self._make_idx_map(self.atom_type) # train dirs @@ -454,12 +457,12 @@ def _load_set(self, set_name: DPPath) : if self.mixed_type: type_path = set_name / "real_atom_types.npy" - data['type'] = type_path.load_numpy().astype(np.int32).reshape([nframes, -1]) + real_type = type_path.load_numpy().astype(np.int32).reshape([nframes, -1]) + data['type'] = real_type natoms = data['type'].shape[1] - vec_path = set_name / "real_atom_numbs.npy" - tmp = vec_path.load_numpy().astype(np.int32).reshape([nframes, -1]) data['real_natoms_vec'] = np.concatenate((np.tile(np.array([natoms, natoms], dtype=np.int32), (nframes, 1)), - tmp), axis=-1) + np.array([(real_type == i).sum(axis=-1) for i in range(self.get_ntypes())], + dtype=np.int32).T), axis=-1) else: data['type'] = np.tile(self.atom_type[self.idx_map], (nframes, 1)) diff --git a/deepmd/utils/data_system.py b/deepmd/utils/data_system.py index bcaeada1ee..a3782a906e 100644 --- a/deepmd/utils/data_system.py +++ b/deepmd/utils/data_system.py @@ -84,11 +84,16 @@ def __init__ (self, modifier = modifier, trn_all_set = trn_all_set )) + # check mix_type format + error_format_msg = "if one of the system is of mixed_type format, " \ + "then all of the systems should be of mixed_type format!" if self.data_systems[0].mixed_type: for data_sys in self.data_systems[1:]: - assert data_sys.mixed_type, "all systems must have the same format for mixed_type!" + assert data_sys.mixed_type, error_format_msg self.mixed_type = True else: + for data_sys in self.data_systems[1:]: + assert not data_sys.mixed_type, error_format_msg self.mixed_type = False # batch size self.batch_size = batch_size diff --git a/deepmd/utils/type_embed.py b/deepmd/utils/type_embed.py index 82bb72ec57..fcd890e224 100644 --- a/deepmd/utils/type_embed.py +++ b/deepmd/utils/type_embed.py @@ -1,5 +1,5 @@ import numpy as np -from typing import Tuple, List +from typing import Tuple, List, Union from deepmd.env import tf from deepmd.utils.network import one_layer @@ -79,7 +79,7 @@ def __init__( self, neuron: List[int]=[], resnet_dt: bool = False, - activation_function='tanh', + activation_function: Union[str, None] = 'tanh', precision: str = 'default', trainable: bool = True, seed: int = None, @@ -93,10 +93,7 @@ def __init__( self.seed = seed self.filter_resnet_dt = resnet_dt self.filter_precision = get_precision(precision) - if activation_function is not None: - self.filter_activation_fn = get_activation_func(activation_function) - else: - self.filter_activation_fn = None + self.filter_activation_fn = get_activation_func(activation_function) self.trainable = trainable self.uniform_seed = uniform_seed self.type_embedding_net_variables = None diff --git a/doc/model/train-se-atten.md b/doc/model/train-se-atten.md index dbc470005b..a742070391 100644 --- a/doc/model/train-se-atten.md +++ b/doc/model/train-se-atten.md @@ -95,17 +95,15 @@ set.000/box.npy set.000/coord.npy set.000/energy.npy set.000/force.npy -set.000/real_atom_numbs.npy set.000/real_atom_types.npy ``` This system contains `Nframes` frames with the same atom number `Natoms`, the total number of element types contained in all frames is `Ntypes`. Note that we put all the frames in one set `set.000`. Most files are the same as those in [standard format](../data/system.md), here we only list the distinct ones: -ID | Property | File | Required/Optional | Shape | Description ----------- | -------------------------------- | ------------------- | -------------------- | ----------------------- | ----------- -fake_type | Atom type indexes (place holder) | type.raw | Required | Natoms | All zeros to fake the type input -type_map | Atom type names | type_map.raw | Required | Ntypes | Atom names that map to atom type contained in all the frames, which is unnecessart to be contained in the periodic table -real_type | Atom type indexes of each frame | real_atom_types.npy | Required | Nframes \* Natoms | Integers that describe atom types in each frame, corresponding to indexes in type_map -type_number| Number of atoms in each type | real_atom_numbs.npy | Required | Nframes \* Ntypes | Integers that describe the totoal number of atoms with the same type in each frame +ID | Property | File | Required/Optional | Shape | Description +---------- | -------------------------------- | ------------------- | -------------------- | ----------------------- | ----------- +/ | Atom type indexes (place holder) | type.raw | Required | Natoms | All zeros to fake the type input +type_map | Atom type names | type_map.raw | Required | Ntypes | Atom names that map to atom type contained in all the frames, which is unnecessart to be contained in the periodic table +type | Atom type indexes of each frame | real_atom_types.npy | Required | Nframes \* Natoms | Integers that describe atom types in each frame, corresponding to indexes in type_map With these edited files, one can put together frames with the same `Natoms`, instead of the same formula (like `H2O`). Note that this `mixed_type` format only supports `se_atten` descriptor. diff --git a/source/tests/common.py b/source/tests/common.py index 70b8794bfc..7a5d01c2f1 100644 --- a/source/tests/common.py +++ b/source/tests/common.py @@ -59,12 +59,8 @@ def gen_data_mixed_type(nframes = 1): sys.data['energies'] = np.zeros([nframes, 1]) sys.data['forces'] = np.zeros([nframes, natoms, 3]) sys.to_deepmd_npy('system_mixed_type', prec=np.float64) - real_atom_numbs = np.array([0 for i in range(len(real_type_map))]) - for i in range(len(real_type_map)): - real_atom_numbs[i] = (tmpdata.atype == i).sum() np.savetxt('system_mixed_type/type_map.raw', real_type_map, fmt='%s') np.save('system_mixed_type/set.000/real_atom_types.npy', tmpdata.atype.reshape(1, -1).repeat(nframes, 0)) - np.save('system_mixed_type/set.000/real_atom_numbs.npy', real_atom_numbs.reshape(1, -1).repeat(nframes, 0)) np.save('system_mixed_type/set.000/fparam.npy', tmpdata.fparam) np.save('system_mixed_type/set.000/aparam.npy', tmpdata.aparam.reshape([nframes, natoms, 2])) From 798d8640206ce76772760d853c5a106d7dee316d Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Thu, 25 Aug 2022 00:13:59 +0800 Subject: [PATCH 20/23] Update common.py --- source/tests/common.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/tests/common.py b/source/tests/common.py index 7a5d01c2f1..0365157b85 100644 --- a/source/tests/common.py +++ b/source/tests/common.py @@ -72,9 +72,9 @@ def gen_data(nframes = 1, mixed_type=False) : class Data(): - def __init__ (self, - rand_pert = 0.1, - seed = 1, + def __init__ (self, + rand_pert = 0.1, + seed = 1, box_scale = 20, nframes = 1): coord = [[0.0, 0.0, 0.1], [1.1, 0.0, 0.1], [0.0, 1.1, 0.1], @@ -406,4 +406,4 @@ def strerch_box(old_coord, old_box, new_box): obox = old_box.reshape(3,3) nbox = new_box.reshape(3,3) ncoord = ocoord @ np.linalg.inv(obox) @ nbox - return ncoord.reshape(old_coord.shape) \ No newline at end of file + return ncoord.reshape(old_coord.shape) From 3912df5350a28b7f6c8804bfbec118216730ee6f Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Thu, 25 Aug 2022 08:28:16 +0800 Subject: [PATCH 21/23] Git reset common.py of format editing. --- source/tests/common.py | 76 +++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/source/tests/common.py b/source/tests/common.py index 0365157b85..38c5bc1aee 100644 --- a/source/tests/common.py +++ b/source/tests/common.py @@ -77,7 +77,7 @@ def __init__ (self, seed = 1, box_scale = 20, nframes = 1): - coord = [[0.0, 0.0, 0.1], [1.1, 0.0, 0.1], [0.0, 1.1, 0.1], + coord = [[0.0, 0.0, 0.1], [1.1, 0.0, 0.1], [0.0, 1.1, 0.1], [4.0, 0.0, 0.0], [5.1, 0.0, 0.0], [4.0, 1.1, 0.0]] self.nframes = nframes self.coord = np.array(coord) @@ -93,27 +93,27 @@ def __init__ (self, self.cell = self._copy_nframes(self.cell) self.coord = self.coord.reshape([self.nframes, -1]) self.cell = self.cell.reshape([self.nframes, -1]) - self.natoms = len(self.atype) + self.natoms = len(self.atype) self.idx_map = np.lexsort ((np.arange(self.natoms), self.atype)) self.coord = self.coord.reshape([self.nframes, -1, 3]) self.coord = self.coord[:,self.idx_map,:] - self.coord = self.coord.reshape([self.nframes, -1]) + self.coord = self.coord.reshape([self.nframes, -1]) self.efield = dp_random.random(self.coord.shape) self.atype = self.atype[self.idx_map] self.datype = self._copy_nframes(self.atype) def _copy_nframes(self, xx): return np.tile(xx, [self.nframes, 1]) - + def get_data(self) : return self.coord, self.cell, self.datype def get_natoms (self) : ret = [self.natoms, self.natoms] for ii in range(max(self.atype) + 1) : - ret.append(np.sum(self.atype == ii)) + ret.append(np.sum(self.atype == ii)) return np.array(ret, dtype = np.int32) - + def get_ntypes(self) : return max(self.atype) + 1 @@ -152,7 +152,7 @@ def get_ntypes(self) : # return nc, nb, nt def get_test_box_data (self, - hh, + hh, rand_pert = 0.1) : coord0_, box0_, type0_ = self.get_data() coord = coord0_[0] @@ -165,7 +165,7 @@ def get_test_box_data (self, rbox3 = np.linalg.inv(box3) coord3 = np.reshape(coord, [nframes, natoms, 3]) rcoord3 = np.matmul(coord3, rbox3) - + all_coord = [coord.reshape([nframes, natoms*3])] all_box = [box.reshape([nframes,9])] all_atype = [atype] @@ -192,15 +192,15 @@ def get_test_box_data (self, all_efield.append(self.efield) all_coord = np.reshape(all_coord, [-1, natoms * 3]) all_box = np.reshape(all_box, [-1, 9]) - all_atype = np.reshape(all_atype, [-1, natoms]) - all_efield = np.reshape(all_efield, [-1, natoms * 3]) + all_atype = np.reshape(all_atype, [-1, natoms]) + all_efield = np.reshape(all_efield, [-1, natoms * 3]) return all_coord, all_box, all_atype, all_efield -def force_test (inter, - testCase, - places = global_default_places, - hh = global_default_fv_hh, +def force_test (inter, + testCase, + places = global_default_places, + hh = global_default_fv_hh, suffix = '') : # set weights w0 = np.ones (inter.ndescrpt) @@ -213,7 +213,7 @@ def force_test (inter, dcoord, dbox, dtype = inter.data.get_data () defield = inter.data.efield # cmp e0, f0 - [energy, force] = inter.sess.run ([t_energy, t_force], + [energy, force] = inter.sess.run ([t_energy, t_force], feed_dict = { inter.coord: dcoord, inter.box: dbox, @@ -222,14 +222,14 @@ def force_test (inter, inter.tnatoms: inter.natoms} ) # dim force - sel_idx = np.arange(inter.natoms[0]) + sel_idx = np.arange(inter.natoms[0]) for idx in sel_idx: for dd in range(3): dcoordp = np.copy(dcoord) dcoordm = np.copy(dcoord) dcoordp[0,idx*3+dd] = dcoord[0,idx*3+dd] + hh dcoordm[0,idx*3+dd] = dcoord[0,idx*3+dd] - hh - [enerp] = inter.sess.run ([t_energy], + [enerp] = inter.sess.run ([t_energy], feed_dict = { inter.coord: dcoordp, inter.box: dbox, @@ -237,7 +237,7 @@ def force_test (inter, inter.efield: defield, inter.tnatoms: inter.natoms} ) - [enerm] = inter.sess.run ([t_energy], + [enerm] = inter.sess.run ([t_energy], feed_dict = { inter.coord: dcoordm, inter.box: dbox, @@ -246,17 +246,17 @@ def force_test (inter, inter.tnatoms: inter.natoms} ) c_force = -(enerp[0] - enerm[0]) / (2*hh) - testCase.assertAlmostEqual(c_force, force[0,idx*3+dd], + testCase.assertAlmostEqual(c_force, force[0,idx*3+dd], places = places, msg = "force component [%d,%d] failed" % (idx, dd)) -def comp_vol (box) : +def comp_vol (box) : return np.linalg.det (np.reshape(box, (3,3))) -def virial_test (inter, - testCase, - places = global_default_places, - hh = global_default_fv_hh, +def virial_test (inter, + testCase, + places = global_default_places, + hh = global_default_fv_hh, suffix = '') : # set weights w0 = np.ones (inter.ndescrpt) @@ -269,7 +269,7 @@ def virial_test (inter, dcoord, dbox, dtype, defield = inter.data.get_test_box_data(hh) # cmp e, f, v [energy, force, virial] \ - = inter.sess.run ([t_energy, t_force, t_virial], + = inter.sess.run ([t_energy, t_force, t_virial], feed_dict = { inter.coord: dcoord, inter.box: dbox, @@ -284,19 +284,19 @@ def virial_test (inter, ep = energy[1+(ii*3+jj)*2+0] em = energy[1+(ii*3+jj)*2+1] num_vir[ii][jj] = -(ep - em) / (2.*hh) - num_vir = np.transpose(num_vir, [1,0]) + num_vir = np.transpose(num_vir, [1,0]) box3 = dbox[0].reshape([3,3]) num_vir = np.matmul(num_vir, box3) np.testing.assert_almost_equal(ana_vir, num_vir, - places, + places, err_msg = 'virial component') + - -def force_dw_test (inter, +def force_dw_test (inter, testCase, places = global_default_places, - hh = global_default_dw_hh, + hh = global_default_dw_hh, suffix = '') : dcoord, dbox, dtype = inter.data.get_data() defield = inter.data.efield @@ -309,15 +309,15 @@ def force_dw_test (inter, w0 = np.ones (inter.ndescrpt) inter.net_w_i = np.copy(w0) - + t_ll, t_dw = inter.comp_f_dw (inter.coord, inter.box, inter.type, inter.tnatoms, name = "f_dw_test_0" + suffix) inter.sess.run (tf.global_variables_initializer()) ll_0 = inter.sess.run (t_ll, feed_dict = feed_dict_test0) dw_0 = inter.sess.run (t_dw, feed_dict = feed_dict_test0) - + absolut_e = [] relativ_e = [] - test_list = range (inter.ndescrpt) + test_list = range (inter.ndescrpt) ntest = 3 if inter.sel_a[0] != 0: test_list = np.concatenate((np.arange(0,ntest), np.arange(inter.sel_a[0]*4, inter.sel_a[0]*4+ntest))) @@ -341,10 +341,10 @@ def force_dw_test (inter, testCase.assertAlmostEqual(num_v, ana_v, places = places) -def virial_dw_test (inter, +def virial_dw_test (inter, testCase, places = global_default_places, - hh = global_default_dw_hh, + hh = global_default_dw_hh, suffix = '') : dcoord, dbox, dtype = inter.data.get_data() defield = inter.data.efield @@ -362,16 +362,16 @@ def virial_dw_test (inter, inter.sess.run (tf.global_variables_initializer()) ll_0 = inter.sess.run (t_ll, feed_dict = feed_dict_test0) dw_0 = inter.sess.run (t_dw, feed_dict = feed_dict_test0) - + absolut_e = [] relativ_e = [] - test_list = range (inter.ndescrpt) + test_list = range (inter.ndescrpt) ntest = 3 if inter.sel_a[0] != 0 : test_list = np.concatenate((np.arange(0,ntest), np.arange(inter.sel_a[0]*4, inter.sel_a[0]*4+ntest))) else : test_list = np.arange(0,ntest) - + for ii in test_list: inter.net_w_i = np.copy (w0) inter.net_w_i[ii] += hh From a6f82587eb9044a11805fd09d91ac8bb2df00380 Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Thu, 25 Aug 2022 23:17:41 +0800 Subject: [PATCH 22/23] Match default args of tebd in se_atten Change the default values of type_embedding_args in argcheck.py. Match args in TypeEmbedNet of se_atten with default ones in type_embedding_args. --- deepmd/train/trainer.py | 12 +++++++++--- deepmd/utils/argcheck.py | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/deepmd/train/trainer.py b/deepmd/train/trainer.py index a3ef294373..7ff899b81a 100644 --- a/deepmd/train/trainer.py +++ b/deepmd/train/trainer.py @@ -24,6 +24,7 @@ from deepmd.utils.sess import run_sess from deepmd.utils.type_embed import TypeEmbedNet from deepmd.utils.graph import load_graph_def, get_tensor_by_name_from_graph +from deepmd.utils.argcheck import type_embedding_args from tensorflow.python.client import timeline from deepmd.env import op_module, TF_VERSION @@ -129,10 +130,15 @@ def _init_param(self, jdata): padding=padding ) elif descrpt_type == 'se_atten': + default_args = type_embedding_args() + default_args_dict = {i.name: i.default for i in default_args} self.typeebd = TypeEmbedNet( - neuron=[8], - activation_function=None, - seed=1, + neuron=default_args_dict['neuron'], + resnet_dt=default_args_dict['resnet_dt'], + activation_function=default_args_dict['activation_function'], + precision=default_args_dict['precision'], + trainable=default_args_dict['trainable'], + seed=default_args_dict['seed'], padding=padding ) else: diff --git a/deepmd/utils/argcheck.py b/deepmd/utils/argcheck.py index 45c28c1d93..9145fc8146 100644 --- a/deepmd/utils/argcheck.py +++ b/deepmd/utils/argcheck.py @@ -33,12 +33,12 @@ def type_embedding_args(): doc_trainable = 'If the parameters in the embedding net are trainable' return [ - Argument("neuron", list, optional = True, default = [2, 4, 8], doc = doc_neuron), - Argument("activation_function", str, optional = True, default = 'tanh', doc = doc_activation_function), + Argument("neuron", list, optional = True, default = [8], doc = doc_neuron), + Argument("activation_function", str, optional = True, default = None, doc = doc_activation_function), Argument("resnet_dt", bool, optional = True, default = False, doc = doc_resnet_dt), Argument("precision", str, optional = True, default = "default", doc = doc_precision), Argument("trainable", bool, optional = True, default = True, doc = doc_trainable), - Argument("seed", [int,None], optional = True, doc = doc_seed), + Argument("seed", [int,None], optional = True, default = None, doc = doc_seed), ] From becf0cb20026fa504af6db686d9a2ea7ad3ce52b Mon Sep 17 00:00:00 2001 From: Duo <50307526+iProzd@users.noreply.github.com> Date: Fri, 26 Aug 2022 01:05:21 +0800 Subject: [PATCH 23/23] Change default activation_function back to 'tanh' in tebd. Change default activation_function back to 'tanh' in tebd. Use None in se_atten if not provided. --- deepmd/train/trainer.py | 2 +- deepmd/utils/argcheck.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deepmd/train/trainer.py b/deepmd/train/trainer.py index 7ff899b81a..52cee2427b 100644 --- a/deepmd/train/trainer.py +++ b/deepmd/train/trainer.py @@ -135,7 +135,7 @@ def _init_param(self, jdata): self.typeebd = TypeEmbedNet( neuron=default_args_dict['neuron'], resnet_dt=default_args_dict['resnet_dt'], - activation_function=default_args_dict['activation_function'], + activation_function=None, precision=default_args_dict['precision'], trainable=default_args_dict['trainable'], seed=default_args_dict['seed'], diff --git a/deepmd/utils/argcheck.py b/deepmd/utils/argcheck.py index 9145fc8146..7ba62f9953 100644 --- a/deepmd/utils/argcheck.py +++ b/deepmd/utils/argcheck.py @@ -34,7 +34,7 @@ def type_embedding_args(): return [ Argument("neuron", list, optional = True, default = [8], doc = doc_neuron), - Argument("activation_function", str, optional = True, default = None, doc = doc_activation_function), + Argument("activation_function", str, optional = True, default = 'tanh', doc = doc_activation_function), Argument("resnet_dt", bool, optional = True, default = False, doc = doc_resnet_dt), Argument("precision", str, optional = True, default = "default", doc = doc_precision), Argument("trainable", bool, optional = True, default = True, doc = doc_trainable),

yHPNlU7g77DMtr(HxSU^Da2v^KUt#>Bd*M25u9j8AYI}+RCrtCSA&&Ee` zNxmoM&P+!5{{(tAV);E8kPrIEK?Xo2O{_*_jK5$fCcs-S2+;%*n~PzfW(j8Bm1$yf zlLHH9T|D3;VBMlv=VvgaT=~4*5&dB+E;615adPLbSg*Hfc+{_ifqfIG9M9EvZ02NW z-&Wg16Rl!*KhBzbU`xc!WQDq=-9#82?H9r;E4*+I%Fx$fhgX^q@_oW^KPzDp{y}jE zzUiPxvo7rsN@_7$3zYKIp=s{I?NUPr1fN@g!%@&@V=eni08^NFy~S}4Rd~Y>Q=0WIw8`k!0SAFj6-0yn z^@C%GeS;m0pQ9@oFLhN=Rf*E^Vk913IyEf1@?Pp}jU<7M{JM7k!iws zYI!x0Wz3BK#LEAaqR9b@hWIr$6*F^ec|%`>GDg0QYgj<>|M^xgd}e);CP_JwqYHdd zK^0#iT0c?`N;cMoIdZEXtrh(%vx81m-zF;B2t-hHDOJN>nl*UlUx>h}(oQ$#tgSJS z*9W!Jk2N-GU|*1)YRCAaBx;&y_eewu`tb!fm&4QRC`AtGF%NUGl#d5{^u3@A6s5AGdoVE94qc#-d!vFqEoWK-7m=&=(oByjTc?->7kr%7p_KYr0#dPUDIjPSpA z%Y;S?guj|)7xg&wb!w^R6Y9Gbo=O*5uG#pBby&Th?1%E=Dw;8Tz}Bzde$MNM9{T{f zs<3kj$b{R@Uf*>044`)=*&InA1N{y{sk=qC#osEv)GWxteuMPKvJONcg{nvyt;wh&zv!$3~V2;MM9-U%`Uj+dn51wg7W7Vy{rJ%`9B&xhh)P;BZas*Zr-k z`ov}BcIj_hk$r_C=tVXM1HO)yJVpM&!snJH@Ke?OP0HDvmTF_X`4!F-Vlm;BES3?R z6eq>O4MP5@v}nDrcJmS`N1zaQOBt$dZ{K9;c3KfZI70i*sMXmAh9~*-U@QX9akj(h z7XHcnRk_-?SlSOP)2m~nKYcv0%z`E)bw}Jb<@#>J%dz>#GC3`D5t-C{?B=g?nXLWh zghgTNJ(B@fL&cvm9iHjlgpVkwOfX;emZ@SzwtDVl@azgYPR(U88 z(aKRL7VL%P<-(>QU3*cOU<2g)_9z(O6D8xK!U}@+PrjdNGFd=|fm?firi6jth6~jO zhK$uN|GT<7$yRwZcgOh(YCZ3BOp4vs7 z{CBR@OHtupfue0byM`e{H1h2APYNZW9aj#F!xcQhc>_Hoba1yChVb8`bJ4X+4~xRG zx6n8?9@=`9Cgo5p*W*j-yYpXiS%pBxW$mvgzQq!0ytJ@#qX>i%R1WM0rEE<>H-Vua zr>M&45=mez01ks+ga+|nj=zF;gd)L+`AuTB+iF(3;`twJ&LR8soyRUAMlyOfYJH`S zehQxj!ht%ZQuCL`3;1&O&m&55TJew9-bfn0Civ2LhdfBe0{j4!ByG2SwFs+dviuqZ z;}24wdb|8^b_Off>fgaq#auTQ>V&%nDz{zn0D@@3%60buAI&V+{1~#s>k6?M<|3Y- z|KYhoYG&p1Z_F|JU3ehc`GY7z?qoCXkV|0P=R=klX2B}v*<*qL`!@XHDH2U2-cP4@ zDPZJ7()|i>}YtyC}=Y_rKChg+D7D{+XktbPgTi_wU;cAerakpE|`e* zQx@$tY2*K`oY&Ep8H_{>-N#L+vP*&F%W&C{tG}P*#9C*O~6*v>HeXH+D0fUYU~92k|{lGfB^$cymnjZV_9l^ zKE8j=&5$s9ryEv*O|f9b?^5$*G@TH*2F-1`co&zZzUJ%hR8*YRkllV)BVLkbOXl2^ zWC1WY_Iuk~3)MT_R0~g-JTs|S_$7e|uf_YGTR|%>q#2%Z?arqiOC$Y-#m}3B4LAIw zjwQgQvvWyIEniNzNdC>m%i(Y760~4ocuK&Kai2(&B`pd(Y~xPK`TV-1qZ4oQUqy~x z-|se)C?jq80L8s!4qgl19c5a?sq(KpL@?k_DXKfUbQ8cicmZVDo;t&^uNFje$ z$8UnDJX7@cRo~#>40v16$0dvW%l?#?xRhf*yHqF^touh(2au#j2+}Su)z%w*3CyL6 z73R#0%Xg#ZCp`>X z4pzzl?VIC(rY{WvlG_{Zce#lX;B(jMR7hanwe}%|hmg6l0X1li{EjYgI(i+~$^1#5 z9y4?ATfs_zmzm9aPI9yiiikE^lI#mvy?`4;aOba!F{>YPS;7PM8#TTgOm85Ihx-IJ zV>pNkA%pTITcW(gXTLjDH!5H#_P@a`=@-C{5GGPHNh7qsDo5s{I+UHqu;|Kf@maN* z${W%VHVrp8S{)XxMi2&(95nx)9IBT_fcJ)*oFRACJ`N{Cj4LX21m8!NTL<3w zVOLd^{ngPsW^sY`&o{rrD}28hsf-G#~OSKdmcNCVP( z3U@`v?ETcYNjz=mGwoZYZ{z`ODY>OG6aL}Ilf#U{_d)b(7nxN}0to6+3YAhWQC<59 z=X^TaTnfY}xFYy>RZbOl%7g{i89TQ(r~y*jfvSQok2AX)y=UdtxaRMz)TvZJPw}mC zJ8G`3`%YaF)^48mLljbG=&ZzNf7pifRMB7X^-?zTXdgPw_wD(w#$-?c`*ec~aZ$UW z{1B+U!rfkD5%%O7ov)Rkd@{>3&xAoTVYqAij}K>213FE{wPRL^+#bgMAwUA88|e1Q~=tdzd}pzSI^uVn3~5v&I!RSVnIICr+zS1fPlceeAy7L)5KU6ukUImtXHA zp;+V~a>a(Hnf)o3CR4F?S636nx{^CQ+PCv!0E-&GfY7y6Myw~}dh;+1d%e>+6Nc%y z!a2c7AA49TApyV_ZV-eMz25d@;)>%UC~Z_w=!}lObq9T#ug?FL(l)n3xV%qXdx;Yd3WHGCJ2o%sWIo{SP}z>=Jv_tU9x%WM4#>O;gP#p}Hf?}% zDe#qerK+sQfl3T9lgl;$L_&^{Dsej!@vQ;U=Kf$mE(vj)?|D*Ndp@I#95Q^OmMDwf z9oZGkFg{+a*dT$_CK&|4!m6vF>!=D=wWkQM5p@B)@`>m1T~(ybZu`b6;aroInzWjU zP7ww9H(nCsrQ6^&x0|z-x}nRBZ>`l|Mz3$_P*(@FqRw3Xumf~^fP+B8v0W-4+W1Mf z;nUp(72)YriKvBiH_8bpVcJR6VA+&Ius5G?Z%x~%;mE6$QV(c$3uzY8Yo_jBMUT!w z!7C}Q$e40f{$6lw4S*tZ4J|$T%~n2MX#4)#0?YJi4gb=b zU)ztLb#nu|kB{y4Nz7erH<)M1cfxxm+c zU$g42I@}I=J%N44=#sY9J#<(0%FGNSud{9L365W75fc#6s40RAY<88_QYp^w`k7kB zf1`Z}S41|#e8+NYP4U*@@&LRb@_Y*012% zDPPz2*R}tTrmt{o@_YZ66p(TvASp3{ks>Hk(y)gfqXkI`gN6Yj4FXbQqomnjj82tK zDHR>1NQV;AAtCsC-kA(cYzbaID==SVQz% znll?3`hfD&qWLxx?w=y!)FLZ!qK%r^(;)!Hu?nl3cRP<;XEcv!RuB~u|D6-7j>vb& zf2?l$=@LLUiopq(%3Ey44pxPGhT5^TT(v0dv8@v8x?UgRNs~Y_>8`qUU*_fTP_mMJ z6c@R*>F%VJl%e$W81>ow__W1T#E1sV(J(uNrD597XU**wbg4W$Rt1AOcDo(a2Mvb7S*EixI~e?lwIt|0%OH+h^B3qq0I!D5EYqY#H$A!O?TexqH5$?YA4Mga13sBpx?b z*Ljj0IRlo3@Qr;_+fh?KOYwE)yFa`mq`MwJc+OVuxBp`s{B!DzvEav2Irfr`#t|k$ z`Jv_2!w~ap2yYjBP(aL*SoTmhH!>fhOOKSycUlsxnK{{nL$JZyNcVQfS%o{owUOg? z4*=<}#>}Y`n=`|Yzi!!R7xcQYki}$54N}9aUQw3u8ojpT1!HG9sF2Afgk|?wdfOM* z(XDfA#`Z`tZo2?O93pN^wx;h%kiL9+4}B?PfUPuk39iIsW29d-`Ra!e?IG^Y-V10w z5l4TCv5flBKn>2{n1Lsss6j-?GcdMt?HDH+xk)QAnJIcM>z6Dfpx*fUb9Hg9!nBvL zB?M}aQ7dshdTJ*6j*UUkVWLncS_8TvUVK$u!Y7}E3s8`{oF^!HzZ8qA?O8mG&Tut5 zON$^JphoK~b%|u#jBgKPF5$Jx{N62*caz%d&Ba=-Hh@rqf2CM3xA-5<*l8ZU&GqgK zR@l|{icjVdfBNfP9(~r86ngOQB)bM7^22-XOUnbElUN5G5nhZqCz4nr&K2A_u9JCx zOKb__t^tTA%DTnO9RyJV;rp{&QvPj{=RC6oVD#>a0hm2+0^$Di)H?oA!uYM03#7Vx-+&!3wxa!tkWPaVVtMs!IUvT+-p`ZeF zO6B<;QkK0BFhh&a)joNfmeHoVvWvtOA~;?L7{%S|TZXP)9YI(htB{WoJ_^!;d4fVE zPNpImZ$$L~*oO16v{5Y)ZD~%9ls=a`ae_8IaG)yA?x0NGHc9x#X6s;n{D@Tpf1e4P zZcD)vj_AQeze$e;!1RPaRTcfs3WgRSsOfD{W_7@yD3Ln}X(Rk6=!=dPXg9bNsss-I%CzP`E{kAIA&IKOu7v0j}Cx`LmI zzg;@=R?lk9M!n|FbT;=7nWxp-*qg+wmW>T%%-#{|&+m^2^5jMGjo8?%uSzdKxIPL6 zp>4RZ-e!VRG>okqPcIbMD>QKN1ROA67X!s1*;||mK-zrgFhUWo27Ty8CtBMD(9&@> zb|>D7!x~8I6=4w1-8rsSWZHi43b;;Sw-h1D699=9n$E9l?tR!F1{&Gbbt9bNRH%E) z+ISEO>yrgh5DQ)!BP$NV*k&Oj613QfZqz^Y#s30zGTPVQV)P}GLoW7Z?eW&Yv>BC= zzb>D!^<4te%o@eX^CrS4RIW;P|ER^NO$KUiQ?>;fRWbADL(bJre=Jqce&sX%1aHOc0Rb81%0cOBD z6}JfCba*y2wwRrNt=@pt+WcxJ+uz}nobA(?7nXwTTT%)XCrf_6pjqi3T3#=`yZ$gO0E1GQNn`z~8toz~}~j zLs1=Ed)ob`5ly!tO$ppvUcyr!Pd>0MX0YM+!M^S}*V4c%D4CXl;WAtDg&Q1)n$g!Dxh){o|sJam7seXDn zwqH4))e=vi9%X2+FLz@nlc>QDbysVjxc?=!X(cSxQ~&Xu2?KBQy%Jk3EYl0`pM~U> zP}8p~brD5qe#Jts%x|o;_t_MpIBO&od%z@yhkcIpmD z__#Jwt3X3Jx!;&!%sC9%n~{oE4k~VKxoIrFRN^rR#Dbl<9}*K0v=4W=XqSI-E`tb5u}Avt)Sqx@+yJ8QT-V6XT$mv7%$yhovV z|Lq+dhQ&i7&uY zPRiiULE2N!**Xcdm(z-Rb~a44Z62lhrK|r^Gut|MvDL(+de6( zaooAusbc z=IJHvE6~*Tny4B@&|5zadM=Tc^*G}@agv{i4HCXv;Kx+{2aw~>9d!aPC5-y)}d z=O>A7$LeD5Y8;jsEeDNDNCc-zBu}{O#{XB_@dLLbBic#z4A5|hYp^Opcg7bTN3-Ci zq0rF}bfU`Y^q8UOx{(ZOXLHuIeQRZcZ@IO#985=!P?D@q^it$0P-iPYt762B)kH6R z+nkSe9JTX`N(=O!aew%Ge_gitw|n{rNll|Vnc0QEf*ogGHOp-#*YgnZv4V)9E5K>W zcL^TD_`|7j!G>wm7c}KwUiCY$E7;fSI&CHolcY`xELwYvZKM~_#tEgmx+xZC4lXYF ztDSdNR|gL_Hj5CVaX?%i%gMI?*5i%oUE?#8$x)vbw@ZbA2y9qv=j(d|NNCM$Tz{Tw zR0IJ%pT=(R;d)%@4L!x{Fr$x7qxWm;d`6$f>d6@y5753;OClm_?V-xnaqPBr^DC*? zAoT>3a3c6OrG*oi5;YE5WERX@k0}CXQAYjt{rs~TZFs+sMd&|2c=5_31 zE2WuyADphMe&5~HJU3DkZrQ7Kcv-O$2_!{gV>J70X4$r_U+~db-6I#dUyq1@Sl-yhI#0S_$u)xlo1FI zGc{VL({+5@;)g^p3wGjwfYG}zs1$9D^ofkH-3+?<URi|?z}>`R!dmnM?l3$)2%_mDl1Jw( zXtx{7xJFd87NKRV;c+IRZ33_xb%^bv>k1gN@RZsVG=-dOAYr)>JqcbbXy@}6JwKD% zDi9&Y@L1@j1Wud4h%Q}xfnXQ<$HalYDLEjGSt*9r*7A>+gLS-@#R&8I`H^@Rb)sz5 zJHW6?TdJc=k%GPk9vb2~k~!ffJNRJdAOmxIuGhyI1TUX?Sw;j-*2cO%iH*D{*CziqFkyT&5LiADqORj0`fyJ(a! z5pZbPw{R`dRHBne*R@al=!yoNKE^2`y1DyTO49QhJ~X8+h>#`x0SkCzM-fTngq}LIuXksl2|BuGF2nps^Z{= z@|{`tW4vOw24_x>h@)(KHCLLB2z<-)I>0KNIsT$Zi6M{S_CxR8St?3lzwDdGh{nz_d~wAllTiD8ksdFFTNd=k}dU;YboRnNF09nsL9maG{&T6z&{;0 z8mm>`gAov`{O6g+;7iSNVf61X2X4M`8QQFRl2ptnG~X)Py!3I#P1moYUsYUcZE+r zt%eBgCMw;Uk-ZpfM#^dQMIwt?b5_!tDca-z=p)mHvdH6|76%~hqsK%wgVv+bRH)5<*vN_%Lue_fv%4$lS(8b>#NP7{v zM2fx@zTf&sykH6|ezZ|=@G3F=IchohP#d4!D32ok@8Z5+89Fo8esV*ye5`=rM3E`V zmXP+k^4Z&Bh#kW3o*yYH414}?m>&BawsiKF2r?Qf;F##WKW>Sn%`dD8D-5D;hEuHp zB&#-w9?~%!${|S#j7P`QsKSO8rGdjybxRHZ-h}?CTj=x5*`(gZa zSl!dVmBszr^VI@~iF~`4w6LzxE z&9`$G*JVnT{JpPA!Dpuj(;kKApFT-mc)yg;c=hr_*wSTdEdr)PT=7w9BuD%&A!tKi z<5)cAH&1Ijib8hb#`RB0*^swC;Jl=0k7^1V+G~bo?-Gc(tlWT`!VIGA{Mzx-rg5zS zIcZ1*VXA3WxI4AWz!&4)^6@_NnQ<=c>P??-t1KQAcWi|}x|KZwB)&I5QK#J@y#U5S zx)MLRkG8_uP60;%sSV> z6v6MCAZu#-U9ah*(b|Nx4xHY^n-7|s?5+jewTByXP-9NQEtWtTrdOP5H3ne-W$ZPMvJG zRv=P0s^%Iqk^x(ayjZ~2>_3s&q}I2wX9>G1lCsF=AJ1wKWM?)n|K!dWH=U*;1oX`# z_)6|nVHa+sn$#iC5>l1c=Yr$8_YKUYwK2d|OlAqr-Yzd7Nr11g)#1z@|eTx_|EUoY{L|H*cR-(9rtI?^zobWMtaeukT9752my?{EsygjwIp zY{E&erFX!{M!qyer*HkZUny9njOs2DgtJkLt3q!Zi@1$R6T@Ey*Q&>WaUA#L*-N$h zdlslPpt=mUe3ozq&BO`>;mbql5)T0!$%Jn}tKh?Atibr#nN*^Wms{$4kC`1z7?e*? zDLOy&Qy3UBShCUp-jQ;M=BBog1eZ?h2@tJc=uXhy`B-?xV>|fQ>Kn<>|9>yi zu4Z{ZS+~0D%_pB=^IzeDg`%Gv8EmB=b64OV>s`g?M#Hv$OOEY}DKnVxgDP_LeH_c( zNVKvW>x%%z{IQ3uur6WAisl6KeiozxQkq}yn@XX7Qou%oQ=GUT1sQbV)ywg**!PFG zjA@mdLgemq(|qwzilDH){EkUd@coW(#kJ%S>m1ZCEfaGd%x`~)@WM%sfJiC^gQ?S{ z7{sh?RIcUB^LOG7oH!n=#Y5Cfr(N}`yL>XRV#_SaF#HgJ!Hu$%zy{s$VU}j=QcigH z2OYbnP+HSD0X_bQL7+cm$|!>dGvD12OlS}@UQ4Ryefsir&+w?hO=D2s@X}QDFyOzWvb^AY{InN;UF} zlXqlvrACU_r5}F_sw7@r;{{9<*8jvHO5@U+^=ufCU!Ky}$E8esF-z;~iwRjsij}F71hXL=NXa7xc@5w4T5VY7<&dDi#BwGuSKjaT`jbp$2yc3eg ztMvTt;-+G@!N!CF+#+JDuLABPNGchTs{#825)R3g#M=6>oRpR$ z)rX~{HzhX}8EDIox6-4s9mpvYc>4O?FmT-RVXmcmoq!~L`q$53sMKe-rYp~PeoCEg z;qc`Eb^dQ*6722n!`hOy+YLK9XbrU3MML(|TqHX-x|32VPz$|`hNf0q)UBa2GHOJU z_Jil4TZ_qC%BQ4~Bk_Qq6~oXy?z;)JgS73hEGUI!($?7CO!c=j&HHwm{I9ujOEnYa zF-=E#ZoJLjejyFb(!^&=q?Lf9%^7f_Cm(iYQNg4EcEZ8o6UoKXF|zE5$~+eVP={^# z%y!Eg1<4KQJKJK(#%o+Ikg2^@6u)G684jlb{59iL$tW>`uCFqRU=00dH>n_rW`EvQ z9uWkSO08>5xPacXvudv*{6+Z7r%WAgtn>lAKbyKZbE-x@_dJ~o3j>we=T`%-LcgZ< zvI)mlrc>{3Zs!`@(P;iSAWA08@Ob(Oo9Sx1?jEB;pX=w@xYg1^_ z`Uu{xHT^^0iej+l2De}B%gOe`X6@~czaNv1f?p=!8Wt>Lj5G}XJ<~oT13~TpiaZr) z7(XPXeMjR=X?vcQ6L|*FuZUJ{95D3cgrEz2reVT?mQW_J&hErhduO-mth;B^viQ59 z*5^93#_(>a>lF{&JIITVf|t28q2%}k#}{4}ByG_J+ChLW^VnCUlM<-Efyd$9>9!wD z=orUapK^&6W2RZ497SVmZ|TIKT-D*(ERS+RnvV#$+6TptrTB?9wH6Op7i}CdiZ{ie zBGqG59iL41i%s5X{VG+hrx0}R*s-`N_l1`++k!TaM=R^Jg7>M#@7*n zE%*{#WjZJ{I}iwcjYu3Wf>2{g-|s*Cej@fVA{l;5YS;U63Kr1|5T9{W)^k>eKBVm& z5Y~Ivw{JH*tLL>b?MVzI zqH&_BVZM_;Hm&nNq=j^>cti5S(_Gr96%9=n2^x! z(!fFpTx~1iHT#&7o+5^5JFUPoaxDKCG{4DAjaqZ@3H?-|Azc-R-5D8?TAZO~4mpgy zpOR{!<0i%6auu_;MQuS8J`#EaWT#CJY2dry3CF1m-H7b79d92kr6>xnXckK&#N{wF z+oeo3(IhO(&fA~~l;n^cgnyjmxdNl=h`KFuukL@h6tdBD z&kovQY2q%7kha_@+NBnNhLX%~D2r>s`1o!spB{{9mZ~q@He+y^b4J&>9QD6CykEkG5k&F+pHXMs$oo5oIp`HQ9D{4Lg&EyBnk$Diok}Qp@ zptB)8rWw*W#l~Jq=@A}89o(*&gA4Vv4T>)Ze5)>u@q}35Py>JG&CWr{(k0Z!c6kMO zVf)e+lAah^Y-}dApB$YS{?E7ywvmm`#cRb|`+iwLY(o*!U1*YP?t=3BqVJhyQBe)4 z4T4Gf`M0%aOY=jH%EE!w&K|cy78FVPlm)6U;^L-f6j5wwiHLs(01k^4GTLPdUlxU{ zmMi^S6SNm<>KVpxKTCA!vDw`0wNRGFREtJOUzjRbHu`y5laeehr$S=!2GqK30}zqo zxh{I$*Xd!`Wb$Mj3-3J0NWXYRpxj*O|5bWtv@+GztA$K4JB;j$l+gW~8S?ZFiXs`q z`m(alK2P<3q8`UZr+bg8C@x9ZL*u;X!yP!>L)GG_KaC|7V}p;__+TP@Z4*UbT%o@m zE7rI0*cf0gIDVo!s}5JLYj``Hb`u3+3QwMwFMI$`Kn5%$AFPWDYI1k2<9{&C6_^)A zo`rcE%}PKtJ?g&(5T4!a)*w~w+5=TX6PfbIEe>sZL2Viuk&%KC)GSjVA++cs#&CTPbjp*7 z%lzHcU9b92d&sa3=W!aL|1R>*ueIHB7D+#L5Ne3p-oCdEV&H;SYMaS^3( z9JKl_H_ynO?OfXz86E?rKDBkMn!|>QwrOnjoU~ZG)T@TuJsX>kvD9%%RqRXnEtZo# z`Hsw0Quz+KnGJ0eo(8R!^SE}8T3tfCb_|lab1^_Y`nicU5pdTV87W&rHiVrAoN7QL z@M2}aCE&YTdf$RQ9{#&?>5!SMPao-^)xknk^Gr8_59_(ev?Y4+XVDG&xaD&0u*{OP z-@{|M61aEn*_d9ojpL>X4aXcnpLZ7bsp}eg*#;4}s8BuNTmptdSglp8I{`e2Y}^@8 z5SXg?adE(vjhPuwuVt01jg0?)GbI3;|N6l*CQ%olhQ&4QXhlFjm8!t&ycFMOo8Eiz zA;tBr@rviB3u<8__=CZq-@@0=%kRD(+ob<7FvqHiokP4+FyyR84nGw_em)JT8OxY2 zzA2>nB*53Kv~I`Miv(#6;+ba>5O)?jVPJ>V2GNY)g3+Gd z067ioJIU(5C@oG30v5fxbcyaaHkL7_{6f6{cAphvjs9VrpsStbB@~jjR+l5bVA^|? zGaC-@r6?y_^O-9R*YE<*3BCuHH-jwJ zMz>#ag7@eDIFa##cXg}g`sWh3sOt;j45~m3#mHQ#Y#wcLGq{H6vnqIkUk(S^8PqC?0u>0WP1Y5P)m$F7WKJ4IXM&|ib@9rpC2J7Nx25#(Ba zC}DF}ftXD(s~aXNRoP~HD0TPyHkrxFo@l(e8AofyO(~pO)eBnkZ+s?S)N`(LQ>xH_K+9u2*Un2Y zkbu>$0Di%Rw~qfbByvBkwyjWFe}1;a)hcuPeyOmv7|U8lQ5|(CZUCR?Lqczsa^?~L zU2$rB>i6!T4q!rRn?_J8DpmL{YGVsY6nVskG2^uZ!#po_Jhn98mGw(H0gSDCDQEb^ z|3P|XT2F#$pDjF7Wb9>`#xINPyi@0d6`aUW|4Np?mW5sen0_28%}E z>k;W^Nda@UIcSkTh44@od4|-_l;Wb^HXta?jiBdA|7i$a`g=k2$&YJy;7LNu(2ziID%O8u-Z^E6$_v_P| zi83=Xir6~=^H*VAA)U&fsB~$4k5?_Ad^#c&X_+bL*HjI?b|QsWO#Ch3rh-_y(3ejh zp~U5P0E>Ue>*aA{oyWV*ez6Q_O>VMrlE!9aXRs28*E5l zAWtXtA+V4G$AfRQziSI1ISn2c3>MpWFRtw(6`ZiF5?iiwe{=Jz4w3)sV2ND`3s6w; zb<8rU6`TISa-wPH1F@^vE&nr-^xQEMJ-g9q?Dn<_hD`*B#E$ZbKtNt(1&f)s+Ro`_ zF1V#SZsSJbCINci&d(`VzCiXMH#kLT?=qe4}diTW;0!oJ=GVrru7i>tTN zCqGZ{AJN(2qr7;-oxEl43A=MUnZ{uiR_CTI+nYP8>;M> zEBh(eceNMfd(%^BL#>GVl8RPk<@k8!ha}s-N~%DZ-YfX;J4;Y%eLoO5uXf)zDnlQx ztP=ngy-n-4)1fCeY%f7syzN?^=+^1fsPpu8h7!^$h~PV(u-RO_^@aB?^LA@PS;!o> zXY&rf9dnLaVWd%tt9>p7Z+*kb5^s&@d@xT)|1j8LEEkfBz`R*&-C8gmMx?N+*GOb4 zMG4h~O9JS$@guKKsSR|$txEatE^5{jqpI68s$r_{Xy;6anpF%$aPo~&!=D1|+XQmV zTyDqaJ9P@kmQ~ue_&O57(UPeWW(r?K>7-v_HT>k5N9B+T%#u{o?md<+O={dR@!`OW z7pc-g25jl^OyYe9ZFKHDRUZrUdc{zY6%%AP0|Oy+oBV$BZus!Nj$+~g(Lh&FGHV>a4SMQ8 zI-96%wU+hvhxQl8%h8Mi!Z$%fDJbIl(9$v+Q!j9tC;*mXY@X2DKlI$4O~|? zIGX=TesAWlR}7p!$?qur^P7U3MvRzPe7IQ#d^stY>xuGfl@5ov1e*@x ze9*fFY}i%G){vsN5B;uU%FOh-$KQ{kxl|e+nx*ap1@RcpP=hXk#N{m}i_Sml+ z6(y0WAQy4Vf9}bM$Vv+vySzhZ!tIqJJ*t(>*T$a1LEYp|_2`YBuzrVAuulcJbGdUXi8}8QO9dpft#V*;PM>eCiE-&R`MBV z8usr6i-OE}o=i9J!45ydj6I@p$&;F2*mY2}@-L*=NPo;9^`>OZO-85D2JBq3Dejv1diIW}k?+sCvw%NP z_ApKO^sv#6-VBYzKmOgJewil&oI8RfH7^Iz#OSi90uYg`b*{R{c8e7(F;`o?AHrqT z0P;*!nr3Te4dQKw)rgtfr>VK1@m8)^WwR}htbMb3;9}?Cnw+hVVlr#ImNkIcd^+g*h~DtT49Dlx8k525%eKjG01Pg9P^H zHl6#1?<`>jvAy0C7~DFD#fo(NsY)bno%YV-R^ma=35(R3SdG*5bV{*Wp8YO$9^+_48R#fxxyI!`np9GV`rnKn z`UDRkJ7m5VWEOWtcZ|QPfg>BT;mzKFOQ&XXk!`pzo*s0Iuk149;FSOo=?ZRCDzOZJ z4&wf~h6|pEQIs^lm3M7SgxM4k4&GnpAWv`K?F8j)py(B4y2kQ%?{hF=tdm-iPjpib zWJ1&{`7eu}gy_D)u!|n{agImc%PEM|`FG%MOwVZKyFN9d`~#JGfFIc*mFDM?ICm_{ z)sYVh#EXS;+`F&;&TMiAn$Vv1?MvenfeyUSymqEl$GHjc?$R6Fw&{eiY4fQH4%z7^ zooGiVcm!UB`335$=ez1Vb{w@)Q)o*IM7SK}>buqbvzrY#U0o_Q-S#m(#GG;6`)fk1 zzQ%57umhxz#=fre{7v^(?rh9L?B*mX@`x3<=0~cR@Rt)MT6=sjPk`)q19?_z z+rqx{n&6+Dg6%&1e$xJDz1-hsa2|Sm;Bt6z_G*G1i_yJ?t)boK#8w7BxHw*l-cvD^^c(n#%En-^SP!s3U6TYM6No3<|fR~UrY57UF`_~%dc??s_PNU z`e{-c01g4ZCI0CrgLqsxIRkVN8`#`ppaaF;F5(xUE@1)UbfS5GOHc!*@} z2hTgApK8$5*OltotroeNsD^sdih8PKLpUtpOrolQo5ZIvXj6*Utx^?awogT@(fcz- zt-FUyWp>3f6=GtFj%is^M>4n5>QYiGuZ(<))#pYvi8LJRR-!2kMQO#XE*8ffs~1}o zq{iDWd6@0e?|9}ne;lh+E-T>8IJIuPoLPvu}#&!M18s!np6%5O1?ka zsp*kW!B8+N+Tm4s%!VFITT0J5mo-0=yCVm;2Or<{vzig>d{O7mFKrtRa!ttM-b^ou^K=Q*v-m;&~p!uQwq#f$Id69VD`Ws!} z#~&g|WP_R2zWD`EX6#?O{87szJ*X`&tFeGYHlnocv}!a7Zfxc^IU!XI+6-ZC&dv>g zb7$(V80P7SM&ZL0lP6>n@AA-+|IxCivg|2Dy576_I3T=ECgkD01^d8v2~5?0R+8W5 zt9%zaLor&cMcr1Tjo)@<7ykmW+Ch~^+8{}y+nLN59OAMKa%fS~6~z&{eqTWpUoZS7 z=7tEUFhcerBQmNfssRGhfo%4+jhXz1Ik9rL_u_r(P!Qg4BKY>r9I8Qo@iOHlnt;|0 zQPCN*YcKEr`ef?fYpP)_7Z0qHgrIhKaLp%$()1Q?)s|+`Pk@&1RLV#=tsx~0f|UYQ zz{_JH{c!jMrlKArW9G-^QQq9_EmDAZuPYO49fhxntZ{P0GpkWp?G<%)enknY8Tt!m zqt%`*w?3T-oO@22!F9SLom}cu%EY5r%Bxq(#CtK?^B#U%$qg|UX;_E2{IW|Gsb(XR zwS1%idCTG~|7j**b?!}MV11O{Yb>cDO35(tev>O1lKamiEj@>bIu67PH)`gg8PUL^ ztl|8GH@Pk7ju2|pFE*m;rNn?t&n zfK(lf`N*2WrI_@`BZDPHG*5%&TqM7fniJXK{Bc0RO-5IY>*O*puH zj%>tn2qns)O#8*g_gq4S_SyEjX<74P!lnch{OEmE-Pk(>_~9=T?5b`-k~@gcRoLTa z*P}rHJG>)6k00+yef!3*b(^qBu0+rP@*kGesD>AfS&sxf-m}i&FFI%g84ZonFcT+O) z4T}y-^si)26E`o3%B`L^)G=2_lazxJYaznA13;Qs4K6fqS;)=pZ-t{$)X*76{X?rGzm(AR zY3NXq6!ZfQkB6op#lo4a>Uf-1KKVTYKsPi5aVy}W1xE6Ay^Z3Mie!ntQiiy}QW3wM zjOAEk{diK&cm9CV(&$ zTP}IL`+29R?LS6zm;+n&&2+z&B=I(uWLs|*t4oG`j6du@I{Nc?qtQQzFm`F9oQhi1 z%h+wu4G~{q2Si;@M^n0r#JoFE(8t|xMt|{; ziG^R@R_X#e{;n)MDv3^!fs$Q&x1EAPW}N8V;TO5yx#(4*6aMdcW?gb9D@W(_ekFO@!^&M1( zAH{42c_abxSe0B~n$FrgJytm6)5nC_~MVC)GL1c%mzj zfhqe#2x{kU0_@ZDf{Y19LLlY7SN9j}%fQo&15HM_$#l%Utk1Fhg#~;pf_)D! zn+@e|X^1FQW0{OCsp2MpWz*?dOaT>YPopAl`|y5V{hpe2T10=N2v>8uWMB#F#5B7;{>17!FZZn@$K|%^3x(O2{ZD!# zwDjK&9`%(w|_aTThDO8iLsJoOzz*bwWHw%$9aEmQ<#0k~PYAzM}eE zSQVAKxH{a!`S$ayc16^_>n}!Ys}?fs{C?yB@MY8USV~)vQBPQ6WzP-Ja2v#ZbEJYX zfF|89u00fh`v*hUUfqO2;1%%s&y!BbKer`5m&-g?MEz1Is*8U*?I!nAa&asCq}Tgr z-S$tu;oX1mr??vucKig4<#ASe1TNl^(kcZN9FOjDd zq9`6&_tiO)>G4`(KbBIK`(kG&HZ<#O?N~j5Kh~{qN~^I+5eLuBU}u5?c(m9 z*JIFX@6Png{aOJ6?JMPC3||ou5QOc5T13|NSM_JVsMchL)w()W2Wh^SOIlOjE-_B#KylYg;iXlP;-H!GxS ztOk!`kp292L^X?>A%Mhy`cy~krAJwwrrxofWo0C==ulEZ-p2vR$Wr^YM+-FwkL%q4 zUh~Vv@62ay?s9uO=fT5ZxBFkJEchlS!-59N&~`rKwQwzUe6AmPQMtrl`<|=6B*7|p zXlu1MdDhLHWWYo;mkcVFJqq5T=a`nz-AlJ`7M=)^C8uPp?ytYmw!ZEl0!@LK!SIIS zE?};F$=4mn;ey*iW)m2BBZF@B1D)t~P!NBeRyTL%`6gpYCpx4Pku&Q_RUFi!9ueQd z?N2))!o%^gHir}$`F%KZGfARV`<7zsEwJAg>9=YpOH(m+$2JK3q4Jy)D1?;zWwLNH zRZQ^Ze)=+^sQ9V^W6+}%E3U-ojfB5=e0bd;4g0hXv0{&JLchR1d!YEUl|J0<1Qbq! z7d|4<_&-MJ{Vl9*M-jMeA6+V}Z7_MD&;Fe~zX#{mtySk?!*Bm?-1@s-T*A>i%DK~A zIafQ4*>dYu$5Y#&oC4E^C(~s_ypZnG9Eu;*l*Qw0q4|by@@L+&P44FIR{}q39&Jls zyQVp;1_fX@HUm`OkA}`E;A zRfcta6s_^}W{sWU0N2kYOx>bjd4K{<_*(DUC;`fM%lVgde95kK8+i@JfgmG}gc`FZ z?PEw4VqDw)Fol`k=G_7^CYA|g*p|YwuxRvgrgijfdvFJsuMm({b-ygyHCvG$NMcWZ zX)Iu{!ADb(+_e;)7SKwq2-37+fVMmAKOCXKd!_q_nV3AooeZt^e@QLK1D{L9pKghr zlI=}+?QmqZfpNA+<3XUJo2ffdsWEORz9OLy!(>-Q&SY0HhJ&A!H!*4 z@8r@IG!AHWE8Z#0vkD_D3d!GXS|Df*U*#4^|LxU&XfBUhJTUH?%vQzxDT`+WPT=s( z-gZbx6&g&pjEfFP`?enD;<@6TRr2@+my|hNzu@bbrrBZ*PWtrT?F>ncMeXf3`cD0Y8v~y_PGyoz0#pwU7?!GY%E{-|0kb*M1M0 zLua1S3MxwMEQATZ5s>TtT5oZcv4PUu&PQ%m_>Wwhlhizy8CnDCokp6T`Rlj948}|D zIzi3CGMF-6T5LZ^GHncn_LyKFUX7U8%p7rlwiS#T4PsM8L42AH zHYn#4M4@PMmSePbKuwEv8lBY@P?)9<2KUC6x5pI^%PHJ)@}Kvz3Nn-ujrz$+=zRD- z)5n9~<_=|;hcsK9I;nAk4}OcXVF!Xs2fi}qVpI$`c;C_^5pTesZy{0+gMAWz4T}W3 z1wR$Z1JDJvo+{{DH(*c*QNKbfQ?;dt_bxkTeR4JaGE@Y%FJq8e12YD?- znTDM~6t;k(+U+^BEZ&|4d$UYN>E6H$N?1v?oT3P!_Ov&!0b+uEM>Qf|fipB)uarWW z6KVGIqu`P>w%#{Og4pKWunpEAipX9^T6_fzb7FZc_6P@Wlr}$1HJp53*Fnm@DMP|w zN;NnmH>czZe(v+{N*&%>_{lu>tAqx>$O`_pqu!0sjY1O1da|W4`raF+-x(YtjSa$H zlN_yDD)_I@el%5PnF&|3#A=-BF6GK+R80BFK8Rhi`Lq^bp!0y8_CJQa^M z+NDgr@^e=v*q|`lBA%i0I?>|QQJ1bdSVF5ryR>iqu>t=( zQoI6)2~{}G-OO?smH@B$L3_Ms--tV$aNwe&ef*hkjq2rhi+`5e4;U*!aOeXX%c_mE zng!8EXcFMjMpo1_p`HAM2^>a`C;;h}y5mFXa;t zDdh1E*CQZzMc@1m$hAkNy*_G@$lF>aG@K<>A4_ZE7n;_29{FFtW+7b!7?DeUhmtmu8 zVd`lNEmx0^Ak2AzvFDCdqnYVL7tz{l#Lk2_{_bzVGZk--M_>B(PhDMK+CV?A)k9Xi zW5pS}HwYvMf*nKy#&|7Ke^bEvQql#F5$)~E47S)>QnKeG&XywM|8AWt*o%wnk%>tc zcKdgzVd8(umWx3#?C$RbJy~Tn!ofeKugcykE(Gm4XM)CO#Q`PbeeR7OkXrLH7v-^P zvW>@KLYooiQ0PMw@cl90yPqs%_y0(`?r=8W?_H}l6|+{W5|tQLt7cI%Z_J3jRcou- zwA5Cs2(emQNbFg)YOkV*)!LLAwM&(%{_^?${>znr-s?Ko^PF>^``pics2n}tO<^7M zsTs*x`yA!2gnL3`zWF_JFs9L1{lb~lIO^^6!49gQ)9&0{225MGEf!cvugX%Uk5rI9 z#@zYd26B>8)cqMh!F4x|`}){caU{D8tlj@`L}d!&RimlPfkwktARQIGga69ysYHy! z9qs5je_{^pjq}PPzqW;#7{Gt6L`fp7KA;TkX^1a1UA9eJLsls?v@Romq8*0HK2}(TGr%OewS&P$RQ~A#vZ_6!H;7L2>$s$ zb+3)O>baTWiwI*6+^zyPCNlgw9ks#mGJ?F4Sj+8@kEilVtYx6Iq{(Te;6CC^!)A2! za|9;4Tpe(qFcn62yg!U~fQUl7h|UVf&u<^|Njrahez<%ZvzqX|o?E292;wgnieu@H z_+;y7V`5Uez+9D-i#=}r4BOL9EQFnR`DiJB`RZ=L_&_qkX;pGla(QKZ8>x!pr-(ZEYjP$4L7iP|&h$+Em0tm~$RJ`wIs{dSe-Hn+|* zLAeMqWA2c}9;H+LYCYBN#D2bLhJo@ZTtU+~zQj z;58+ca<#wB^j6+2pJ@%PsI}YKGsc>^iteYxx<9=RpH0 z7-Hu%v>{`PZ>~h@;4AYuoL`0~$S4{(1tN5(P}au-Tp$b`+&Q>Evnmp@`j98{<>$jm z6FI2*pNk8*qX6+WZGZ)}5-Xozc|QJ*fThtQgE4NvqgW%$GM}Z*JaxTb35$sh_9x!pUtnIkO6k!q)z{U2#G| zc=_E^&9IIZ#_>EVpxrtIiNuiqS}u=emi?r^*LrVWYxvA#3B z$|7g38)6V^#Gm#NmwWpw;hk1@TqE6$`-!tYHAtI}AJ82S8zfsaGSVa``af?ueX(mm zLU57PucSEXfjxgx%%SJJ7%|~w?0lSGr=`&V_14?Z(x5PLHt23OFvazDTl}5Lwb#yV z)OrlUQ5$y@Hc1c_C$~L{F}Q`Ur(F^>hjkoAa)abpVak&GUhC}|MNa=*-bfaL7Y)cs zeNqJXjiM|L4_$|{BAUBMi_>Pl?5#Gk_666V3q)%tfajVhn&Ebac1%0DzInrD%)QsX zBPSkhM1rZhx|)HDsPu?U_0cXo?dLki3YEhV!`#Gc+kykDq(lPO^q)w{zvFSO4lYuS z#hq+mV*sI7B!P7Yx3_PLW$ABkz37-kjAllT6hDEiTCCZVmS_hYjOH1o(S`mvyjVD505{3p8`n#u^K>g zx*;3i-uu! z{f%kLzC^Mk1OJlDKkvRsc+6u@sF>i3XCi(nqGBry4{Qzo*&?qa4ysDlf_ACGf|=rm z`1f&=Z@y(d8p_SkD|K%{zr3H5YwUxHYmNudEe=K)?wIj4W=pebRp$xbh*Ua#qA6>; z1rNZ*yitI}%&N-WU99ulOMI~OfpjTm#b-~XX{*79cvp=AvonNYDp5V(m*)-OA6v-P zW5bYt&V@LMr@gMBOq!rpNeQyN0;9EWlg{!2+cn^DfD|*;?FAjpr{69^6S1qwijj2W`^w_rz|6tB$VZBrqz7wzq_EeS%l^ zANMUgdB62I4GruwVRh6Uv+bMWlSBV0bo4_u-8wCXT5f+l>`nhK!A+<~U>bH(kP_I` z>njPTw4=68vD4<}pMG?eZy!4wlBUf#RM>b+EMgS2si%uSTzz`60E11CKwg|Hj)Vg_ z(+gSVY&@9DE-}rU-j7uu{A(a}z_Kp(-7AFr@_1U}8VRkI=RRtj`cYkvo$Lobx1bNr zqWPKXmZP@LXJrD5wJRb`>aHtjXgG?M_h#s0w4Pp24G8gQplEKNj~s;jUj6fQ)UxWB zDwRG%ERg)|PWJY>4CQJ}h4c-lb z2&*Fvwo8bo&#>(7Q1*Vdx#P1JzpI`9F54(Q)T@{(vA=IUI^X@{Sr^xgQ1|SJg>tM6 zp2IlqdzK1U;xF~0^ecJR9)P%~oA=?o5iy2qctGT%tx1zC%E5H2SgK)-4~dbBWSDdh zd_3#(;SjB@lg?pC`QgaYCt6+PDxO0?A(fIb3LDxBkRv9<{N!(IiCM+6ui|syMfcxb za1^sWyKfRp7npIg3}inw^@z)J%XbT>Oz-w4eJcDg@19KcV>$W1dBe5SU8<1e zw9F&XdyvJTy)Pu_bgh>yld4#nyzi9hRb{9~spE^3Y?niRim|A#fILMC!kr?q={chb{h!OorxGgK@tNGsnSspHd>DBZQJi2 zs%?w=tXSQCzZcRFC3bGrhP=+iTmJV zC?!e`qAVwsS1XWO3He6+eBRZn%8#%Nzb=gm$se)mQ2&S#edq8F?@zK+MtrQ`3x_iO zWx0{2t1KD?ML6`d{(saU?wyaHb%**#-aG^hFdDfp{$8eVD%x(|Fp^Tk5|bfD>Dqo^ zeyD{_KV77NwGIo>9h{e97s=6YB{X(G`vX+6Ykt;oW~7T+Mx?O3yZ* zEBxEI<#&j1Up>_kf(GUFWE;FKc0kFeMF7PD_+MnkAu`Sy5Hr*rV=5Eb$jL&ZSD&yp zd%HX767a>kRo%0x=R;KLSXLhFy#kf5VMFiicKpiv<3;yrfAvRV8B(do%7i8^g(q(E zK0-+wMaOqP>jxNtC$!s!Q{O_x2`bt0LP5Oa{QghI=;}ZXTYE~HWgu$A&+~ZVoKx_= zO3oU`qeqi_3$~&eZ1XQ~3_%~CS8==wRd>L!*mos2l2%Wehnci`4Y1Qx$+53AR+bHq z)NkY(wJ^Up@VE(EZoHg!>+$1W45e+0`%`>ZUXjdMWMp3u9i$65_+rz}> z4K+@ms2;Y>L4Q8x=3FEPt_W-u8P-{#NiFk23f(s^d%VecFQU&}&t}szTK* z0V&>?7$C7t*nM?W#QxZA+cSJXjXB`y#cGG2<*NsXCa(OYn7(J7KYlhzhEt4fc?WpS z(U-&#y@98^n8u;J{y9oq1G9@p@i-RgSm0yyvV1{*f$ICkuhZbqS}%#f^+p-+(zjWd z(s)O_SRh`$diIW3*N8Q(h=@3hxD2dGs)l9XYgCBZ3a)-0HNApwbK-lV{U-QQ3~|@s z(e~{c0-iR8A-CDjZI=vMPHv;!LHD)in$g^;n&Sa;H=#$K_LEYZA-A7W00qUTy^_s3 zWvy2j#4X*@dhf|NU(rdKLS$DnK&}ltr_C{d3KO?@6goGs?3mCLA#?u4j2llssUNm9 zx`Tv)p=Pwau%}oLM$E%aOw_Esiqx{Ao=GT>XJJoNtdFwK=l#iaRv*!BIv$U=?fY{j zuPsE1-~M)M+_7$}!1!dMpND@l<}kflv1=WhcSYlt{`OT*l}o8bd#^`46E0YlNYs6I z`N*s9+^U0u#iZSlsHiLWYJjx=A#II*FxmVYxBg?&e22IjOy@^1Ls1~Mv>V5gAscJ5 zDEs+}e4h0a4VwXc-$&UJ*YdY&=e$_?LlMzl#mBJ(Y)&L7YS#*?KpF8;V?!we-l}Sd z(TzUyPv`vfJ{FY1vOfUQj7Jsoe8o3g&~b+O%opolwihCVb9yhhs<^)Wh=>5eNTBp@ z#!mD<$F{Ut`0uk-q?wrB>9JNmV4<9JPvGtIc`BEh<-yvDZTB=;##pz$s zDE!7m4gbS1W)ye7EEj`KpC>_=h@Mb;vvc-4+{Oz*rzRhdb+(U1FhN9b5162kNIX+R zqjIaJkRa{9V~{HL)sv{3Y6_+QNJf21A9zmklpEPQuGqt|1hn#-6ecd!@-}7v88=p)MLHu~NWxVUwRE z&O&{!RevKTE7le7dCw9v@9-`lC;brg_QTCbMN4V>#V`2iH@b_r7b9zQT1V$;7a0)E zC+Ls-bvH;0qrFZM}aS_+y@xis35U-tmAGAsH!f3R79mz zKasUS&bTinFmH7-CZbO&rr3}chg!_Mc_xKp@!$z*aY!1|I6wu=Kdem{gWPnTuPb=M zL6pFyHfq{pz|9l$m42)3%eH^HQFoKJ>ZNZy)9K^Nr+5}OJ>IF?Qv>QWMZ%uef@({s z&1QbD$xKDjK=VR|*Ky1wYhYwD|V zcJ@1r0fsphV7%W z2`^#KYe6|ESYnz2jdXKhbO$QmuM>l=WcIeh#7zK3SZvDl4AUy{aRr~jNNjkApW~iC z_18OBZ{XOnhGiov%oH`2yP&uT%sj$p97~;H|A{mESaLnq1zPc2!8;7N5oyxfhLiy( z2&LQ&8~KhgrQ_}6^)-)uDx2Wa`bJFj-TRFK4^9XIv(n=^0$tS2wMr3qj1${IwS)hr;%t zz{YMYC*_LodtW(Y=PF8!N5gHb#jEqqvW~z5S{dR_8GEx>MW}y=NBYjHz1DWE5D&^r-}&M6WGFBjhr~-F zfzs;+ETb>+w(X1~Xsxkxdu;O=FeeTfR){GygOW(&D+LdF<^Pk>M&wI@-v%?gYp-D*S^vG|O*X zNr~l0PlS%8eCfQAqdBJ$8rvJ4bUdvoeC1I(!ABGVIoc#M_bGJsoOY&4DC z;t1Vsop`eQ#P;NdnM%3h^Z7}NyBG&wW9o0+wCXF3=$)016zUbZv68Hzd~_q?g!&Ug;p9!j#_IOCv`6sDEq_-R zu}T5qGW($x>SvGCAivEGDL=n6>rDeCgK}?L`8l~*C=Ih@6#H5Bp?WLO;7O{s$iS+I z8)36+dHjxKZp9OzE^xHYDJYcPSKs;buszXSCF3n`sqKlQ(&cFf8u9U~PwA1lZLzTo zb-8ZXo)(nN0IQ zedTc|O5gHyw*8}YZGeVbJBo$@Ry*RU)ipfQ)qr->qSZuY*K@RK)Sg#u(QEg+sJ-pY z-sdE)?|O(&vw^8!8p$>s2v?6%CLm4U>3^Dr2MWSfu{Tx=^}`BHV8-{&zCwDj0c{jh z=+d3UfZUqrH{DJ1BG?aq@b?@AUaJ8+TT_>k8`8;e`ZFZZghtk``at)@ITIcd*$TRVA#M81iAr)EvO?wzP_w~pN#sXHwO>w)=EEb-{Mwf##|kqAx{$)9$`a`BX- ztQDni$saxp+%XC*YQ3fO>scr;aCliZa5fY5BgnO=VDyb>e$LCaH`N(8LeIWnd=r44 z(`dkg2UQl)-3RDN;MYYkX`UuX8a7xk9v75@z`^bnOk<|_xKC-7g`DJg zwJh(eGNW08yAOW-^r0*Vx77rRzE2zxq^Hv_RpW5Jx!oNhVQ9$j21;_+9r7~h0g?|g z2UCA2^X7WpIh1qvMfe*twUB6mFQAYy?)KX=`#{tE^`+rdn(Q zc*~7~Rey)Tf{$PQ+ldt@*vG|e)R!*xz1wZ=@F2$-Rkt-xILLcI<_=tl2hMkv9ZGMr zk&om_OJ~z9M#O&g`YmLa^hbh?$A9sFs}VWCy&m;v4kX*;?O_Vn`bb=O8Ai$;rh}y0 z_E*=14Sh#K!CF{YC2A)Db5;8g@=iX#I2`#f11tk}!R#8Dj%ll}A>*$jUIS0doy+z4 z+`G_OCNzIetz*q0gqnVR=#0b!?7lI&IEO6e^&@+`0P+++1MBQLwn-5w4|YNa6UHG> z=vnuR#VHv5(|{gsG(j*>_L@Dl?KbmPDwS9lJ8ymkc%r&fyzeJu6kSZjQix+3VDhqQ`|5u|6Cwuf=l#qK zo&cPy@k3=<=V`-bT#`kkHz2zT>TquPHtUHvkhDHum3`JxE(x2?Fe!^O^wP&mqPkTr z{qgT2SzUCZ6zJ0;c^&cszxzrzuY0vuIhNWHYE0tWJd^xIXM|46NB#L9w&EhCsf+fD z(Q*CDN2m29^q9+?arw5$G9N9Q<7hrHVD)vEpj0`2Wkwpl!tKRSObDL;i>hOJSsPwr zIZ(U_c`U>$xsp zOXHnYnI0Zg=za@laO5X|x{><8H#H0kuBv!q@InhHX5g0j*-j!|aS}^Xn0fv6NBi?N zWs^EkXR#)^z}H8xlq-4l_i>%HM1u&ZqR7J2YrOS9638@Y8)9{fS9aS=WW@Xf&L=7G zACDGR-h{*A`1bVbNHtv-!z?C+eLo+`^bKHqRafQerMTcfu=D*p_g_DcySLSTDqg`e zZ9l=q@4Yy8+cTi9m6@`tO?aD(|yx-1@KRhJ4RAfQP@* z6G+D9>ATLu=B-YlpjPA)gCQ)@(a;Tz9%FZp*Ff}wMTrsvJd2nXM7zVV%;&ZZ3>N5+ z8&n#Gp16C{7Y+B$S=Orr@k+BBlq`T>8Z&pL31vh+RcLV?vN390XIMW1u6zVbDU-~x z`Qs5WEJbxlx4Q|nB7ex402lq=ol|v8sVC1s)CIN3#}#1@R)cH1=rD3lg*_~k*s!nz z9vRPTl<7FrLSt(38RZ1s2ly@~nN}9a>TmMQ6J)H<%FPC}I=Qtso+;qh(-)?HcxH-l z88@=k?1NUZwG?pxt-rBzYasHstB$NUT*%s^<=eCc?}L2MzA^EvWq$)s6M?*!wEL|W zBo7G8I6azw>jrnyLRydZU%eN?@V3@n8Q^CGkq1rB_zDT_k|GOM*P$xLGG1d5bdi=- ztCY819{#;4Bh>`hxE!8zKFcZpXbLr;MaC_bNG-#qAJVxYS#*!dqwmIzbf_ZHr?_?Y zr%UAm7@z?d51Msj0YsXE{R72fCm8YxjfdSbxZ8qR_J$t6Be2$=5(7J*kxurMe&Ixyw-}Am=o@KXX}T{g#{eg>MplG`08Wkb7w7fc z6Lz*-moK*?<3_n<#5(5=2FF2Oshj|>v_i(}Py&6Rff;+~-HF$li#2F7a^58b_DZ+Y zc&GgYq*A1b*H}wF*`nHgXb!>r@vOog~Bg4ES zZ!0v#e{Ljr`$ht(93hSiO2cg9-F?e7P)wOJzyKrm7^hzK4ToNH2W@-gFF*EHf*Q5P z&RQ+M8&k_2E*v?~6S~W9?XK{AwR&`%Gp1R%Zy(qs1fd~Tx-X$Iu9y?#P;~~-<)VlI z%$C=FQ6H^n3vMgJt5fOHdZ}XAWgyW2B%L9%+xSCqDMa=55*l{4N|9aJ22zIvGv-#* zL~ElX2Krx{Tim_e=|l>@_nz-8C{R_s{VH1d{vPN37f;pa;9xb&GdI@+dT-+$Y0Hj? z0uUXHYODG!rUXfAY`_Sg!?K$gPK*SKa-h z_dmB6SF`gPjUAS>QDpDbgc>+UL1BL{DW7`7ZLaiQ`9_&lMLfooeFEMX)iK#Jtoq+l z$Y=D+r*(pJ<%-}@^hmG&(B2MvA)&JBIG_Ag%CEE_2batl4>BI4(( zLG-(u*w-P-L*c2~BTN9+)i;CO%X+uryV(}RKvasXd24|HqCt2~UvW-&- z|9FWB(T{=w!-uHLENJ%%wm)rrY~S z`13~xWYWi8L*5n3_wWCWfDo>y820@N0?niu5kksKb)8K01nLiE8I|dePO`OK)B@(4 zi>+%e*rF!=9P(?YQx=?$Mgz4!L=dm)sDTwN&Zm0bqRME;pmo>Jvs|)=>u`nr?Saxi zVXYDm5{#{V;hZ^M#K5gVHL5?&XVgD2${pFgnd)8T+@}IqJV#PL9%H!=vouw*Fv2_J zr9BdPn(rWfMj38o0KC$zzPO`-F+?jmEWsr>|BfVyci;P+c`g*znO3sHW zb6b=0>abIK>zv=2QT~WdBh?TU_qG;&<=18SHcN3ah-KPhEG&Yh$MagqrIS+lG{w^V-0#;U*7=xoS5cw+CE9 zFtofCoK6q5TkkRaXX*3D>PVM*KNR!7Jf{@pyn2=%0~Y0h-7i1c71QMZeTR_{tuV&m z$CJ-0BkodtY>#!Cz^zvfW)gJFe_B0$h$MYGMa9QJ-Mn(gyxkb~Zaeg+;M2eUb1DwF zIOLFP>BIp4Pd+T^Blscw%2J<(%0Z3m@QXaKR7a+*(ath6jP)_s3cTSzc}LjD(FvM7 z8KLHYqk83A}N{eHs9CMvno{{FrrdnKRn!q;+CK}?|a8=+|dQ?5>#5yb}z7b z$PG8-;sZr{yno%>Qvm5$^EO${{XE(gVL^DukX45i(*pH;O<+_{;tdOQXq+CU$wa;^ zMJuVV{q#``@cQ;cpkgX+&u8B0A5SB28^f^Y)BK)?puc@X1@}bq3!k$)#-Tn;VFmJv zg_rWTwJM(-F+96{fHc|R8)Rj#=e9usS<>{&tAj2TEMZ3@)eg(r6q0&((hZ+#x*foi}-H>t$ z2vmUUJt<#?*OUTrn$eUH5wp)bfzzpWH~3?a+G5*Ngc+i$c4&Qqk6Vosiz813V$ywE zgyVm@#@u8uVNLzD*;~yj!ZvCO= z{n$x#koC2axvQ6FGukkb6*CCYyWA5FX20CL_aLh``p3mV6*Ta2Q3dii*yUdv8#Ld5_4Q(bxc4Zyd?X#p8;P&a#8vu;W8#FEE8BwB)-QX} zR27ixK5>!rsY4EW5~k>NU6=s@uK6aCp!?t|=xFfC^^0K&Z-+pX@R9l*%aZZu@W^&_x3x*!}!Q z3`f(yErWi|q_Wq&LB|~Tre&^G`{5aAzrs`~m!z8OwQi?o=e{^?_kU*gDt<1`(b#o( ztHWC#+QggXUm?j@i7dE})vWUQ4{`)*1N$_^QLP2412X00Bmq@tr!O!l)SQYZ#C-3A zXMDrqr!k@J{xoejwD7q@1H7-QSn6(pbh8Y;R|6AyW1~3*5Y=0Ktexd)Py*?JJ0I$0 z(4i%G6i>q6FnEbiENEBFF&{f3@ebl^XQlJ=^F7U(V10%rB5cDv{xloUJ`-J*(CR!L zN51~)Ekx-tq%JxxWKq)D^kmZsd;5)0SPXT)76Wf^U9lna^EbCupp4KbUYy_7o_Fv` zED)>gYk=RdX43Cwj#1$>qfS6_SL56nw5HO$1qgEIMXM zc}MPIs+tE>urv=x-hQ`WUTUic7)|8B3o694wo~C`9uQa&NvR?G0&`(iyE$4(h#)TX zID&1;nHEQxaAT(KV=HUl?aSMzI)KQmF9CCJ6!7I!hanvjN;hygy^v@=RsD^ck^cQX zGs46Y0Tk2U`YZkWFNf>y$jB8#0iL^Ck{`hE38;?V-EJ0a5b0`cEDFYKoR;gL_rh{O z&K9%ZDxIHZ0TVO(hE_&63pIj!V@ycW7x-!^_0+L7>J4Nr5NlY_?VpD%3grPY??&ro zV$z7U_Hk1fX3lO@1nz5VOfCH&3`P1jlIU>eW1C`&xgO1V)8>g97Hs>@tp)&cc^X6z zYx)73g46$w0)K58glp~^1y3{(t~fV;sS#-+o$I+@U9dt|yGp_PHpZ4mBV^?tbN!Ld zd&J^sbYhq5s1xvW1ZHG+RPi6ynC62i(#KeD&|R%C%w7LxjXk@`?_A5UUpYr(p2Wq_ zO+*Cg&a0RNze68Ci$rLc&hgh;_<1{0(mylos_9bk>Nf zEoN^1Ei0C@&0!>H1;--p+&dhF)zE7+g_~Bh&{(L+4?37b`G^#r+z+aso1mY3=_JQBXumZo#4`i{2HT-=fG0*(A){KVDhxSZ_V3LlQn^+Q zGUD4wb@A(0fJMVxsvLRBms^U$M;YEy8rVpQa#WEs)>ZghXUDwH+3L$Z|5-O;f7;FX zlmC@ip0V(#P&w*G+OG7nEOGpRv#UBGcmI7+E%LEj8o(P%5=UtwF92 zLLM{-Q_4|**JW(KS;=#son4cELZDGEWrzmgQNIqJWN&ZVSiddUV%hDSdi};$Y>Mm_ zFAe7~o0!=uXz7!WsZvv~^N?7>6t@A44zceU&v*SEy51U|$5GX{@*K4mGAJ&kkX4k7 za{@S{N+yKPCnbem-fRTsOG-+vW>Fo(Qp%2)rH6+x&m>T!_}&VT&x!#R^D`~|PqCXt z3wJ-m?oSNthwz4-X)=AWiWYI2$V|+YvmgnmEziJtncYmAPNAQRHW`(IAp{#xlOMke>I)K;}Jti_;c?z?vW(0XzyJDi-_TmnA? zdL&7o)$r&$hc>M6!4?%L?%^^#a^)n~IAu?Mk-Px{a#Rzluba(8j%<%QB+xA2)%Xub z{KhqUc^de#~|0+k%t=_0|fr;g!UR2l%VX7+`b78t*0ZQ|d=0 zpalqhI&Wcsnaw24-JzyzBa;NKl z-27&4p!HS-J|+L(jup{^J#5mIxa%5irk&eR>k%{zxnI^^WaW_%fAr$ zu?kSYKv%9t9Re-}FfkVu>$OQ}ENTFl5&N=qbwhfkZ$bd_Bu*Evm0f7~f|4t^ zuoS9fT7?pSQ-&3saOi}Pq~8%BSz`+hNb!7PH_gs8E2Q$p8tlexLi0Ly6_;+WLWnG_ zMN5}ESlYAXY4Lr?+zr(!(Y8NCRYz8kC;8Jx)YOqykx`Qu_TVtOR4WRV+Nmb#43am%7oPIS^b-ji8z4Ucj z;^DnoIBOV~773`)dKlI58iilBdQQg(RG4Sjx(#kPgNwnTXld&rn+L8e0NXn?zF4-f zYi4}7;z7whk->WqmOiqT@K~*P(koah@u90XRF;B5m)YlGP}}LaQV~mJX}XUpVnJ9c z<}cfl=nO7Z7Cg)dZMMJ&ILz25<_2fW5LKL6<%0aZ#UgwRZGOB&9ii8{ZN2uFv|OtjZ9^NSaawiN0jQAKtxq2Z1?P z;>Z&Efc#!R8PCVrne;=WB09}d_b3faDDM^ysjLh+%~af~`Xw>Mjd38px`3{xFD$gy zglNEv-Y6vcXCu}wsD#k{O}#KC?zI)%J$TXGV~sGSn|JhlJXsyWp(?NO$(C`EBNvB{ zo<5CTCgH<+O_kxk*&xgtmm14`zeM-%4K~%bBphs zru1$=@;}CU;3>CUzm6JGQs1V}w=NV32w+3=ymz0M_T1WIRJ!CfCvtz+pMP_&GA8sz zPo99t*Yfd3G!m%pKagj`_<5e5V#?bkXobRQI-xjBcdU4Z5Z@m z`&Uk=40nvGjqH6Q-M~%_bC2pcOQKs;z?5Fg^kfqGE=T8-cjq%&fV>pURf$$3LN^A^ zN~D$}#+)V}^lUJKS|Atd@zWseS{po|%VfB0kMZpNd(M#OLn;ubZvLvR>_(xgL6g}D z*UB%bD|R2EtR=3}u}Lz|V7pcmc69ikiUrxuYE#jBb#||I<#m0}x8Rx^P{rkEE9GU^ z<<*L!>UaP)ghY9ta!j)_1h4Zs??>m_LZktt017Sq?Q(J%{`kEQR#L*&5f z$Zmu4PR<~lB=sxUy@X2qnm99@ZCq^YZlXiP{HiIZ`F=%rb)&7@Tn1%c$>ZdFwBS3C zwrENEQo|%1B#>w$uuW-56?QWOzhn{VMD^cGIz!@zJXOr~{>qumLOT_*1Nh$at58 zW-)juFv)WJ{Y`c0e9*0I>aj4CxRvEM54|fWce6+K9+~#e-s338H~hj`oDf6(!f$Fj zp=fT`yF#gVLSFyX#S(<)Mb&$*eZ4Ow-@<0|`z9e-)4qPyI{xkp)HF+~k-5E%SXWGj zwk?#?cto66J0^YW7yr|AqW1WSZEU59Imoesz1OVc)Ii8QVifkPfs{#*8 z*c7-reRKSrr&j5coHC)p0Dn;45Lw~#o$fU@^ALK;!^2h&xVU_X#F-=zzvI1GN7+Ci z+>z)rDh%>XKsrS0}9aU{(jPdWx~P%1Z0*UkntWwbZ5N#?T=K4&MPXo~y#; z2Sk#<(=s5Ln~F;V^JTTDqxM1%T<>wKSus3}!76w_mVbhMhv=P@#f1&6J<#Ri18_2` z=6&e8k+*f-CJxsrtEtFjqac_xud6|gi(Vx-$nExXi#|JOmu5OhoU(-5l*ainA_UP0 z&W5n2U$TM_KJ5gwpOMhE+0X|oYEL*-*JP#Gdy8EU3G&#pvv19}a+JJnQJZLn@6xM$ zFrI7p;y;9x4-OufDM~59*m@w27o%40@b8SQ7MsJ7qAAfwD_XgzNwUpx?md-|@vD{1 zLl#%uxLWx^qmrv&rpk);S=8|RXJu0vUi#bOxKGReKP$P30xA5`r%G&8Mi+4$+eW4< z$Hgn0o3^lza*Y`o&85PPp2t`Yl|-PUjux6(*-*Sj25lozWOx@ zgff(8GgD0vpTR$Q^pW{{rGNhs*f;VuMoDy-xiVtt^)*FFVQxdP=dBwSgZ#VS?Hr#3 zRa8O+aJ0f{qnT~< zL(s`v^ocp1MHhJ>-EQm>*~;+wgpo(a`}_J0c7Sqp0K>o_Ecf$QSf*W#y7pOUzv#VWOv#&J?w+B>s(%fdewkxsI2Vh~h4HK3AY~)5#?X z({rDm{|{gMS09N#jG#m#+&<|vf=i*4s&13HD9UAp3)8^X20O?f&13UmOdnh;j^qe# zYMd)BcEmarCZoE)!+J=~r#Nvpzu%eSW5Sr{TpVv#!=IsV*f(#)pBOd)v05))am z3i7kT-jC-*ldb%*_O2=yil3hL4U#VeWm)amwFu%)Jt!zN`Dg^PD5@Jv0>8J+6%a>_ zVtu{Wu_p}v~y& z*%k%hR)Yw~v8Q@ALh$kMm?~9c#)c=gtD=IYY5AWh6QK& z08!zan&}M?#8q4XB%#Z7*8Z@2rlOe2>+@|4a08K;#f>VQ7L$~_=(;%l@rwHU>(Gg@ ze7Zq3i^GzA_h~(?A)XrvL$}KENuEcv*wC4pLgE0ikJBJwJD}A$_Ij4dh zrovRQPIe=nb@AT}h*Xqo^|swMlh6+b?E3>)`42%5>DAbpaA|1SNBM3zH7U>cYZ!9l zIE|l8E35BXxmg%^qYSXb_zkrCpTv*4E~{qA+OM)mebj7HH>=Q#!@cn zgY%Iq>84+7zlgOGN8YaWy}d|q1?tWNZu`SE1bHP(Ezm`aRv>@x0EmyHgH4a`rrOmH z`;)@{GUpR4iX{72zvZ?6nj1^_>kmG%GkXzp6hRqljMixYeY3bwCf`sn#%GyAuwHr| z_Z;Hx^=TjBu4~Uz-(@nFqr3Og$@!iy@LQJ%bK4L^{5Ad9=;trF|G%M)>X7vt=6TPF zsqGOY*gODVu^w%6-EoT?%~e=z{pv6Z24w)7$fr0{2J$twH#}jm%%iU$JmM^Z9FSy@c$LKu2RDX#4Nlng`%c zF31wnay>Z@Mem~i(`5_3#enEAG9>|jT4QWp{XO0HkfF_&tUo30Re7+>yPwxe*H)-M z1cDgpf$;ff@k-Qm+kLg zXS9AWDbOZG(l#Mm>2J=$vmB_#_=A6_*aq1m2xZcGWFBta)_N`da80lf>H4X9ba{}# ziPEpPR30r%lDoUUo^ms*_@>bPE^s$!$mVf#fL&@PrJ*U|zzlRZy&E{+OZoWpy*2); zo8?em>TYPdFm6e9q!yF5e`A2PCwllIMv(aO{AzK+V2Zda;x#~dDuMVvvc57Z%I|Ai zN>K=LLe{=$Vxou*GQsr`Bu8Q zG3_rl@atuokBP=)x1q)XA%#A}6K=d;ws$UI;=(V|*kB+xtk{FGwL zcU^{Ll{6nXT`)1tveVpn&>J@n>ep&+BnEJY69~(!ru1)V=}Mjs^}ns_c@AbDeJv@2jwkQ-?cF~cV}3KekMrvgTe-|o zoZZB)(+<&0xBvGF6Fo#{pemk~gX4pSFF#0Hs_|-qoG-7}^+aw;UM zkn~S>jA0R?Fgr+8sp{&oXk76ow=A#p@a+9YB!18_E$Wvo)pM8fZ=p1?Pj)nk=G7C1 z=Em%==R`VW7vsOS|GhM-(JNGNtzEh5J{!`SMR1r*u;EWECTGZLLt^Kuf7A_NQct2c}$~W9^0N ziz(o5ey+Qinr74?yb}VgTUhHMv%bV{BUN6)_qHtJ7}0C`d^Tl1Ys-I*^5_|4j=%7` z-)0zLqHG-qTXx5fEhyabU&nO8Hn$-v2& z@{0L~NQFCnTp&v)9!SD)M|W`3C+VEMyEe`x0ai^6WOo_O{k7l!>I*1P0;%J9g^+2$ zmj^s>u5!1h#WC+j0cjkas@TWkPh2fuAR9z9&5^z|+|XC3;rQmJwxxDs0ivYgDK3~)b#p}kN1}lNdGxFCx-M?oCRmTSpFZ}g&p9FJZ%c}2dx|lU zMI>*b0fx@mjeCT9AT{=r2NgQcxI2u}rr+>w*L@j(F&oO2sg<6!cCoMqM!&f*pI`r` z1P54BHA{N5w4yg26{hzUKSEGL7;ITqBB~yKF~)?q8q~i5&Z)^=&`gqr$dJh5eOj_rf>e+vt+@D;V)TG9g6P^MK-r8J=7tlOn$q zOp3&B!No)UItKnh$X{EDhx6yWR6=l;)MTh058kLH)ZcUtBeK_s_?Cq}ZceeqEkbee z;*!a#r7ZhXHs4E3Cr8qSI^W2>NfA4$c_tyEGMMJ^d!N;^?1g0O_U86yA(+gGp$!{} z!27v%PAONG2Bk@lYWBxprcQ5q3C+R(ECl7KVQ{@FO~&%%Kt+8q;WO^*#tYi_7KN^X zWbvue}0MIGD){E{={)F>{7$2P{}0K!2V7Bu)@D(&pBZC zS#__SjQGkSq~(DJp{ybqymKMn7LrRo=Lu$v|zkZM=G-@Q!CA@(^C^}*$ z+y4yf7I_Sqn>K$ByH4jd{c^ClAb-W}*)9;cJqN4Lw_2*V%`vFRFsL^ueV9Z_(G;x} z(4#T5eKsQ~+AI>7DE7s;{r#S+-v13gjw?>kt(ENVGF+b1NBC$yF(hjO+G}a?K<8i2 zNeXS`)>}b@V(uALm|I*)W)hlGTom~F0L>i!xKW>#C9@g@anLX?J)>!2hW*&z(E_ z7-~H1{V;3I7RKs$oXWt7W*E{d-aqsCdTGAlWY6dTb=f#2y8obt!0;$au3^C#LL?Yl zi#rh{J?>g)?m?psG1lhG`Bec+ z(A8KBGN^<5zJPPyYI8onBEwpQx1-kJbSd{x<6EmJVrIoAI{loHZ4P&u^bddGH zEy7c8a%t7dyjqjm>>9QjH$q=%Z{)IPKHaD@<)|$CB*4!yCb6^r%C{>@k4FJpO`>l7 z4SDE;yc#^659nGv9S#<%AGIk}e5v)ux0DL>gTN9J8TqT-e>GC2Q4)l(eIUAo3WVxA zn`$&)>lVGP+mg?TebzLr?eoKeh~4e$P$PU?11@-L3?+Z2%=j2&L-qy!z*E_e*T2~& z*}nQ{}P347ma5aW&*Q&o+>Xk(8FPTh?*%u`|PDTq40|O z=9>Vl{xZZjIm4+U2hNc$=ibBiFSg!ets6YlA)a!beZ%B^fSOqzn`OpI#9#+SLLHX7 z_bQJ)N#+inXKV6W6SYEh{J8u5z34hGefOQY(Jl^;;r8VrV``0$WwL=SCv z>G=F_g1-1^n8I%c=?s|(a!udu=iCn0u;A28Xf1%`_k|$)xF;&u01OH+jt`TCKzVH^D<5{mN%G_?g^V-YudqX zE~*+~hF6fU#~uIf#0N{FpiD8Im=}*idYvWFSZJh=BKsJ4MPlFknPr)EF^5vx+(JB? zfP#%8vMsl<*=U3*v9gs^>M7C$xA=^cm8)91;bjrT358o zrMHQ5VR5rO5KO=g^}UYPjN2EdFRWk^OkfDv=-eD#a1jZwbV|iV6Z?A$h(Y+vo?R;4 ze`my+r>R!+AQRJJJ@QPEA}_8WMeSWAja`DnjRbFiLP!_;_8ZZtWDvBKmZf+!)AJaZ*sR-YNP=xlgqo3m@H~~sA6H@3bizp2CdiL3$vOxUA?h9)B~^=oX1i_ zgKSZ`UNDgne}!&0L;GQ+2&n{wlaH0*4@5U|Y{%DLfxEY4v5eU9!qHCXQ;8IeQ}KH^ zl~AXU;{aTD-O4Wg6%G7VY4mm84Oe$-*-xOCIkzHZj<~~eQXu^RdrtH32ty=!03|vd zjJG3JjT1(iw1z=XXFn_0p=0l%`NEV#Q?7oUoA&?|KG5nMDPGk>r`K382lPJ2TGIld zqPlsDhf(l)i%-NPPjcJP;$_c~%V)mcsiF$s&3VcB-n#!gYZEQG19i-U!kIf~9CR}Z z&tLZ6GX82;!yK8PZn?#1C~y8uXAR&074Ndz0Qk7jNw4$h2Up*>UHd0=20UAz6B+-N z^S$S}o4aJD6N6@uhx+#-f?0jlNA(@MZ|?174$<7u>G4H)Rjg+U}vhhXWg(>_TK;d0NdH zHX1@~sv-AyXDAG8VTs5GbWkr5%avi@ebwMr+rwTdnt~f8r`YM&9p81;vL?4i+`( zPTZK_O@(%(345MVgngLz|QX(~R*5{v~O`QA|855S#gp3mIR9Qc*|F?p)as}5M zatTFGJiHbaprt&!23ve(^jx7xDDtZRuA$Cxp8LI2=xHam;Xl4XAMrAgyXqOl>;QnN zMIe?_<~{(JYLkXr5{@Ob=yobgJ_Fg+(PF$g(6!RXB;b(ayc4f44s^wQ6Bh1ttZQ~4&5>%6fX%>uIP)woT zVy5rGd4hMGvGAS{u8>DbS~e#~dgIe6B0#ST`{lG9Nnywd?m~loPSe`-2_GM`|05VC zdJo0g;G<~(%#CAK5+5u=UmMw+r5bXrACM@||MRH-Vo+!vJ&*|%uA7?~PdRp3xp3;D zYg}uhEI_LhFve!@Wq<#41Du;4Gpj}2w|VV=a`agk5w`zkfq8C;UV#>ifGoSnX^lRO z>=@y_=GW@$Z{yR7Up&0jvYoZUtDZ@5(%wvBz01#(RbZVpG5b8D6ryP_l;=idJ| z4mT=f$V75b(iPtXd|oun`j4Ng=P#J})zC#KW)fD7`U;!xVsD*TggK&M`OhjT`7qg) zji*;&RVr1#V4yE{ZUDrqaI4PrA4(M(>>5_jkQ-au0M>iCua8;byW(%2LC&YJAN%A* zQMV=7HbI0SlYHj;tP3Q@5SqN0r}^e4M&kF^a-{^N!pQx&3v?8bg(l?}^mVLJ2O=2y z1c$pu_QfxA$RqpoY>4u;4}#l$ax9~0uFT#RYpI_&-b zP`JKDRz5GN?hR}hvm(knv}8m_Y4X+n zewNNGj@#ZMfMF4|4yxDU5W`yOsJ)RvYPG(^=_(zFLB8N3VQhyMnZJt z6ZpkaR_XkQ#5*GFV*&ES5!Qz~bX?Q59_Rc9bWwwyJh3rKVvJ1yI}TZp?1CZUVfvbK z@}HM!sYBEx#}6NrSgX%S(2u0@mJa;h&x{iVw(dU z%`Uw}l{h66ElVxeoQ z3Aj$2gCz(jTFi8?VFwFX0nyZsQ>XL&!ovOS?>8eIr<@w5Hazt$yoQ2>Jauv&Qe0L9 zcrFKY(I&M04h)es^?^!a9(4sY%c{eU{Getc6e5L?KUCgnyK8!^C*t()*_NA~%c2kb zLp>gTlkl@9uAU?Z7Y9`cCKD(@H%_Hb$m?x-V}h=JZ&pqX$dj=&JM_Jzw!vZY=bR?& z8Nsj2S(@A{KIyB*nOS1HeR{xsl1KF_mU@b zSYG?w+lRPz+ti9E>+Tf!D!SSwubUpSumm`2{1oS%RVYj{?BQzqriu}jDobniC_o2e zi1x`K6a~-_@0QX}ENr~`Az|;LfWRh%LD0zHo+{Wd*%lodTSaJehE_5{`vY#Ej*d}y~m#m7FMe&oJ{2I!JZ)wLs>D41nJ;R0c10(e~o-Ch3JC& z&9mZQv;Yr?_-dD#IChZLcw+k?acnBOc;e$T4ho&K5rb0HXDN~L#h)M3hU3rQo#EpO%@CvaJ5GA4md&|J|mP+ExLY<(BOOe9qUCkR`~2amVi%O zR=F(gY2g{NCaQ}^1iV)N7!)wRZHp>V{qCzz6~bg#S01cvtBZZ62H$Cg>@r(>GlDQy zFmI}tsG5u4)7l!flP7d5;d`oi;t-$tBNv35cTKpfD<*(S7TaPUJ|1M|KpCnhi=ilIu=VM<>Dnqw#{?#es4BBRUGFZrvm3B?9|4kpC-Jj z(MLOet+D>kn%Yg3Fh2w3m~5c#g`H|AKDCW;x`WpG)tW_zxSA=&GrA-56Y4u9lR;P* zRpZeF;1_D-DEl!Ya=zguFcDQ91^;#uc!?X|Bemima?f;kWU{cY3LF%t~| z_tnrrP5qW328BM;$#`5^-e)6rzsfy!bc88# z!{)d~7TuuBWeCS&_Ly*%e7%(BwKs})%R&ylY&ZS_4bj}_41Ly2(wBhSo0K_YD9>WZ z<8*f3?p#jowFy33w7~a1Fz~}Qo}L~0Cx(Ed4{pY zx`I+yz=HojB;tpY6qA-o@bW8e%{|GtaIqRA@mk~^iZGHcE3Yl#zVttQCCt&yd3s5S z;cZOUZ{p33r^_cRjyPP&^aNpbQNZsikGh%Jz@W78hNBv0^IFnQx*lK&r^g=IGVnywK+7lkDB?dw5OW@L=arLO#-0T&gUUj zMaZXHQP&f9$J))f7r6m)hqfEQ=EO+qcDgLxbA;ndycqAw#@VO!ZlC6N7BE>*2<=-N zckCv|vR8SN4(I@JS*DA~_8vE!yf=ge4&1z>z~&!p8>ncnPk~T(6tfud<5Ni%{SIIv z`mI5hcXeZhiCX6$*8esU57OLh2}!9liq|0+3?9yZ-;%E1a%-Y1C)_86ch@~1wV&M# z@>U*pByMiVH2v5md*&AOuaOij8}j!ncg=0TyZ0z)#}sCe*XWULGD6aw_5LCDahthY zj{Z#gRGXRM!9qkTTEmO=-izb+*mc@v%}O z*9i~&1%Bn?eR9OqHlbKiuwmN_D}OMEMnhYFlYI;=&dU%^-Jw!UqI1w~`cbF=JdgJOD6CodbU0u~k$VW!OGH6+ z6XYj6@J(%wD1z;!wpgHm)* z>yBHJrn?;IB(M^;cBny)4m%Ul7>hdWEY+4O6VcIwp&p^=*ck%Gxeg*m*dtQcA~Pzz z|1k2P)6Ty^AAMAFj9bSb%W_L)*u7j+(jyH=J7!Sxu;~i2O59Z&#_BXnXEZTNBQJ`b zM~7K4EHN>Y)Dr-*2!U5jE5+<1qbWqOm{Z3~foP_($_+u+SkvH;=}|q9gxd3)xA~Cs%wpg}*OSu$ht{M$ zk4s@Uwgu}o3B@AeNJ)k26lZ$bpM|5&B#$&4+Nw23x-LGmU_W_5825N`;MOW9ZXE6rvPOyjL_j z4Y*W|^N+9 ze@_bS_*HDRT<1a&MR;^CSn;WoeKn%Q;2Dk2W^~J(e$xy0y1vXGbZ^vS ztD?krEph7GHMkK3uO|jkPY4)^JaIn&RU5lKTnY+o40GNuH0Vxmxvkh5wfr@IZEgx8 zBfFP|+Aj|OyOS@Sfir!sZ@B|EGFm=QR6%(1J0t8@lZpJQ4mr8y?0_a<(FMXDp_CR- zu{_&9!zjJ;U8|`}bfiXKhy^rBkj%$8%n9Li z#?er!x;&vD`#9qG)ij_`PcYiz`H`o34lsf();hoJoykmeuogEj^SS*uv^Dh} z7wJV&8C}-sHYVvw&g--Grg!UQgCkU9>~jy=pkBPn)(UO1Uzk#TuOt4;_qNYm6(w&g zZnJ;;eF-hOjBEtHx_4H5`7_jh5ccT{c=lO)lCDf?bD|xO#lQt3K8i4Ti<7Jel)%y! zB4lH^V!Yq;P+sj;7s&~6F>*UzuI61KiAj64_EWLT%g1;B zJis`v^bFhv4fb79&II*+MtW4>nytY62JC~Rl$QF4sa)W?>=;#JJ!ogabMM1d*(Q-7 zqAylG4cH2bNUL4r#ep7d4s7J7UIh`t%=h;?3C8CZ=`=3bi5@d#oF;-+%QpL~=Eu0$ zWQ7nxc#WVcV2*gGr!nj+-YeS|myluCAW%2=baF7`i!O4vP6PLW0(9o>&{cn=q#0u4 z*yy3cVG8D-Mu5xX>ea2f;0%5-ng-K&K5t9|aCM;PWo)7`ST&l4dnr}_x(9NIWR(dZ z0F<`CXzgFW-S18^6R90h@kuip&8G32lKYS?lHrwio800cX!iie}>w5;ns22NI@<8{=eic!{0iM@V zhJooV?4*CoTG)R>;j}069Vyli;nZ3IRt!9UpC_8LK}@W3P!CKUp+c3E!cLg{+L1C5 zREh?!>Rrt=OAkf`pOhz3U#QrJv3dq83HaFFVnDZ0C;`RAOca?uL>Cj*PovtO3-#)C zB7X#6mzl+G4up})YJc=vFq8*R*cx6%n6AD_TY_;(p zSwl^$q8|mo68)njvvH*yE_CY}gT)HTlVy1$ybSFxuW;ZvA^f45KBCMW)KgcJT+psge#sw{0kUafDU zAxpncE|h=w(+tr&3*79+)^}Y!GZ?{+6ZQg|!Y9ZFcJmLV*Vvx6uq-vXhy1JYe0o?z zbcpu02aPM&A6U~nOyyFa_td;@q2`}2tmX0SA^{rUbKK>j0ffy-q7EnAU5tww{ zTOU$?KCZv7+tG?(yT`FM5Sg~mC0fNkB#D4Qv(8heX1cw<3K_`<+bw7V%KBSm^x}yf zX9gkIB+I0Aq--u9XY8!gwSPbsbB_by3=XAdV=n~b6l;M9v&y+X$gzt|G6g(=MwtEH zhd&b`wIYJ=#(!sHI_TSJki9nngHbJqeEiXbe&G%H z6N;`^d+3&zfQu3S9BM?r752^n{6L{+w~oL>?1N#6Yn$+(QJ~ zf=MysxZB~lA+APWJ71iV^y^svTYjr;D5r+GEfkDbUXB-qeN6MCH3X&`@pZ`DDzv@< zL`TnDRe(R?fGf2HxQ(^up%`~SSA-^Us2N?Gdk5PQGNz1|! z_Cr{p|44tpn%zZo1P_F(r;`I_o`#**?6+L`Gov@3E)=CInu(tPNa%#0V+U>#uys7^ z-$)vZ5dsDs9@N4WjA@ja8|FwdOQeVE3y5?m;psT=iR6D4Bes(qRk3S7N&M7x7oa1t zxYA)uV{1^nFXZ~rxhETus|xoxl`-a=a+1HNBR*KKlf+QO0%lyUx48G?k2L$$`qN8@ zZJL=~KNb07c(RS4vX!5%j#!)XMsodB(J5)ED~-P}NUg9W&h2f4OZmt1yK)|pN}rnj zjd!5XU&zjB`G&K*eK(df%<6ZP`=#1zz8WSl0tsP(Xgho*v^zMq!ad(0BCMZ;f^x3wx9c3{OB^*{%)L@nc_8X?>^#g z{BS+&owJx$&^P_>We8$s!utJ?u1Ja1W3@r8rg9&A3ELgVN@CbNV>(^6uEwuSOO6I$ zUKKO=P>OLV|Cm&q^*zV3|5|F$2=`9!24W|MCd2Hi!$fV6&Iq4{XJk}|D?jha*mg7M zc+B=c=!^(%*W%UIP}!sN4O4vJbJcAu;&)1nR>F&kXwWp{&0WIv5c~2WmZ;2Jl-k= zCIEH*`&+sV>|C>c<-to5nPHoPRK#7xCx#{dW(p?5Rx5^^tYBdW%N!_MH1CI$D%hYFb4vW@k>h zgv~WB&26{zeeq-mqDsrU3Y1aXVxn_w(6v8-a<6Oi{1`YCLdp2{?3^4uCq??pp*isf zg2@U>i)d5U?!GG=1wxNHeorRPMpaY5#9wQ3YPe->>X_C+{t_jrI1%N6`gQgA1df#1 zaL+*dOkHds@?Ascab$-NDjLd#w)C$Er4yJq(5Fnj#~~9KE&E#{rDJfDg|7)E<MeTD09loZjeUDBZe;hb5NS_`Oh~sE5XDn0dxia z1PT}uGlMW%;7xg;cG@eu3LX@fNcBDp^=C8XzRtZ9k4;Eb=MksnBuCfWe$d)%Ye_hN ztc|l0Ql*%Hc4=H|H6KwJ?s>dYRGrspb#YkfC#S*pt-zsnh`*BcH@><)Vu zsrN@oHMC0*8pMM{LmQs;vm&F7WE@hO32Dk;h>&D;)9SjX@7bJQj=?Ab==<70|4ziH z5CK-wl;@^UoAdzrR2D(eddk^!o}b2b>_N~kKWOV7O|LtXHzG3XQ&wsB^DP*$m?GF#(sANSfF+9zg$pPoT8`66CMF5ctYUk=yW5?}HRQjsd z#nyPoH1E;Rzm#{Cn#i^a5G&vPDiiZ74Hfb?iofG(rCVBgwf)bSoJ-qvts~jW?C)Q} zvM24UAvZz|fPmkppdESU<&zI{v`=O5?Qf6c?kS1);Fgn4NqZ6<&&uVfB3X%?)*E-I z!oZE^FDn`IC%oTdQC<{Rp5-Ql*7S2{?LW_?yO#CTxikdne7Crtj!zO*I?1dwZ!=Fo z)a;XA({Nyx1rzbO=CjZ}RhdI;(CenC}_N+M!m zFNT;^IOXV_ONGL))fBX*n!X~hiUU+q272O%$q%@W;wflXHi^9H z*ks#TX+WI{-0rFEkybz_xu)T|Fun3dH+T*$tiA}w%U&y7$<7^wJWW8Ax8fq}8w#G> zaMS_r%@vKs4>%Yv)_i%-OpH+F@9ir64=qC)fBY=DW)d~76(K8RD0%J1G9kk!giTSPLyP8+m@Na> z^v1!UQ(?-`ly@H?*TAd~f>1C1nT^ZIk1pePTk6l4Tyzx?*yYNNko98Y`|#}51!6XM zasY&>h_qINg7{5%&Oe`DE=i+=;z5J6M3xEXT8w$pArCCK=DI?!Z|V0R<|Gjx?>Fu$ zt-Vr)>7hSq2QTat6-y;PdrUUM?S#Jc4M-QywC#KTq20^z`!Rk+GD1uYG)Z0s;Z)^sv+41PIWPWg;as(0q*M+m#1A0oKYafni|4|=0>N><-4~od5mqH zHg6l?quaolA0+g{0d7nC9q*&i!-npKvig~+?uD~UC2G*3bve?1^Jn{oMc|KYN)j)< z9W}X*yE*A*AmR4c*@bL4NrTo@=v)1%M2o14XMbs~CWVjHZ+B(o+2l*_T9d!y+Xn6Q z%LU4}gIcfOHLui(KK2409z_AtV&z(XZHp`&=CU?+sSsLU!&t4+=TNb%8WGq1KAw|a z&9~-1iW^O#m>_z?dZQ1Yd}7GaYv1ZBoYB~uMmb3c_PpJf#r@*BxZJ7t&{v`tuCiGA zPMp;I_bWwiH<*;vRxY{|-}oP6tH{TTtSR_h^3=}IN<7f6+pv*-GC0^SPT%)GlO5Vv z)qO}ZWw?B5+=cdGuJpW$&V_F-wwI(d;j&*T0!AO2LU@}KlqLZsd53KEp*AXimx_Ru zvBL%;q6;5dKX_74O~3^p>K)ky>|SDZW&ZCoG-AuV=S6ZX?()t|IK85 zo}ppkPPEWu-jQ>QxLA4e82um3%e6cWgwh81nOd%CNeG6X%Ww~4FMfz8a`?j=;9HF* z4Y|IJ8+qg+Y5K=kIL+kG)bFoc6aOVtxR;&z2r?Et5yC?59=ALe-6uy)y~-&DX&Vwu zuSCly^m|Xs6VR4_)#>SuDYMS=0~B{cv`3sw%F`Ruk|y*tI4UAzBPUq62oL;|)rsga zCH$XVT*Vw4fjmQm}IWE^?23_i`Z|q z&)~;yhPq0aG~_^`@egr?YS$yW82cvc5g`J8_Uy@$j5wt+UNi1;RJJmR1=q=C-+}Efeq>vF* z-Pa+xl8SEYmKz(`OoRzHbs5jz>u6K=H8N@de!`)3ciKttZ!a(Qas2N{SA$Vaz*J3~ z^hx*9a7ngk2+4~1&A%(tQ56gj3rbXMQQW5*poDsDU*|C3h<~Kjp7AqpK2=3m(@caZ zEljV@Rws&nIE=Ge{qOBx#ZUBAu}6&U~ujD~_s;6w#fUY=Z|e6)%A<-3AV{;8`vZ+oEbO~G`ve5C_`r$VC!O=?Y8@zU4#}B9m%=d)vbqhe=~V<7CvB* z;ppO$7CCE79q?}ARzh^`AUj7o$Y<3jX#_q$wp zy8CtXTcU668#oVK`r+otIyQGE3C~YHqX*f6P;My1(YUa_O0v56s7F8YyVroNMuML} z?AplB0!U4YR$sO-zM60Tr_|%g7wBhK^DOn2j$?cdJ;k4SuBB4;ML*92E>F=gu9!y# zg$DI8K(1fPLk?ONK@p({OxFE1-Zx+R?_fkDTZPx zG&pqiHqT;T6p#Fva^rdYzdGsm6AesB=Mxt1p=yO!UEA)`o?BnOlH|Zh-Cm&SxT=NT z_==w@aihGdz-s4foJ;Z&Afd8`x>Ht>a7c~wtfo%Es;P?(KXVL78$4NfQod%Y{z=9n zg)s@?15zp7b_2`{5J-0Dd+;MO*#v~OI!!%FoZ)%hcP})y9~W(hg&s^w62K;#{1qQO(e{5%Ah;xMGLY*eJt?F0t5Z z8%F9Gt1 z=NChbGf7_}KR#DRnplTOC%;jUC<8^pVQRdNFz9W zXe-1Tz_mVfXlD?_6V|BoGm3^BP~GZ%NaDW9f|b>SKEeu^iZACOh@CAtfr3I)5M0}3 z`MqaTuhbb<#OWR(f#D`Hf_5x21n-S;ng9GxTpUPPR@Qh7CY#_zcnH=c@312eti+!&7G@QO(u>_lN{(~$b@IJ;V z>(PGU`uo@RofA48NrFy)l~kPP`g1(`!y(d#pUc5}>V`8VudkMT zOC&R;2VRv^e!9C$+Xhpu#t{wGE8nusTJW$rnnd3tuQXCekdWiqTolv2S>R%B>mqP- zNy}f>>$yUu&(E_d(UrTqd9*==9C8<=X4dHLSjc0X6B-ByKE=$UKe!q8lLU*ixPIow z{1oBnAa_N~=?^F(clY-#IAjAd2n-#a@11 z_ba}HZ~gx0aNz$EpzxsAMliG(m}p`%TxsCsB@lC2If>&zpCkdgH2gxH(MMgvv8!4L zTDlp|+7SkcO>*LzOjX3F-G$P;f7$=%&OV@nN!9|5|^qMc^oNYq31h@~rdu{dt&R8c+%`a~x~SNOPN~W7X$b zXBnPh#H&<3tbVv8{}_dHEPypd3Q`L)X#KCV+nlJ1AyUu4mu9jp2_SMpmA8jfvX?~N z$&mJSkFH)nP!@k#7X9d9u_z=bh&r%bvCQYczWlJeAstwCYh(L3e>l!t+2!_!+;=HL z>?V~XBK*_{Dx*IiV?b9UhFsjuN0`sQr)n@Ncc|X**bvJF-y&b{ogpTBN`$_ruxFQayPp5c` zzaB0|4^oaLvGF)-PF{55q8#_HSMLNnKwFcyza61{Y9hEt1Y^WE zCUVC<&9+21-redPtaiV6c7E2ie|z&HZvvYKi>oR1Ty0D|@*#~U^@H(w%_WYif%hXh-X)jB8N9XJuL856Y!cfXRpAc5n5yi_f1~YXK#E^IVHz)&2cd3E=wpzFAFn zjBQ-ho*NU(QbtN&@htA$snDP#ZA0HptMNKK>p(i!1}>G*ed_D}>%$i@eZErqO4|=u zM>03pQ+l_pyLY#1)vG(zkSfEgDmS)SZ?LgTY~y@(x9t3Q0?{itZ#5viDs<2r_4;L# z@83|6(_YE_fv1nF0M!=kZf=aJY}-pni~Rsr&zh>4>H$p5l1r}=YWI6*NMc_4InS!V z#+zndsGh%tJ6dC8`2|ivQ#W-Ebx!x2+iD`Edu}R-wh8Mut_+;9doP(L(G6^Ig2T373mZq&wG9vAkL3d~PqMOWOro&k9*R&}lStefdfgmAf7K!BQLUetX7?sABv+q)RVPL;oS#u=3B+q>l41}L ztnDEpl^d+ADEmjzrIXw$*g-bdnWP6CtQE%FJw#h}YXzv3VQP~oy$4wr3e?6}2a_!8 zG0bRHHMKZZ{Mg2&kFWEm!^d#Se1wmBu6GZl%4zoXo;&1uGAqX<(!O_&@z*`s&IxeW$jU?Z)%Y$(k|H2`=RJ+jaA=9@Yu zNlVYiBGoaRN-AqNYGR51;(Gl2&P0iwBy;;4M1u8pQcKJ?O8=B<1o(pw-^Pusy3?lj zxiECJ=-+Uk*1&jpLqhNh5l7-pfX&UZ*N-2VqPsB1^z&7QJDA^EogQZ6{gIRx?ro6Z zPRA1Q`%?y^PiLglz)o7lLvh>T4l;NgQ}2!Oo3wl^{`SPq>#c>Gs7G=e1??+}K+qr1 z^@e8LOMOvCeRp3(A7v@1OivKyG8+At!wd#<>A~B!mFEn=P+C01^76Q?i1&^;B&up$&B7LCot)oTJ>d|@wJK`BCNx}X9rXE^G0 zRgwqRK(d+N+qa}VON1ZY2^wc8O)%M5=>aqS55qun?HVTx;~#%)!Ef1*(|*?&C?e~d zBED#&TK3#mLwvXs{<*XIl z=BuIz)z1I_Bp1XZUl~wSpu+TorWx?ClqfhJff|+u+g)fq7Ig{m>UZrI7TKMY;mny^ zXzj&KF-or1cC*D4m(KpIWBzESUBSSuViTl$`t(7$<(*uxJI?YK5n@5l4;d^{fyOZ`;Kger7E$CKw_&?c_E z=y(;#Wr@!&&9Eyw=V$$w%rNJ-M-ts*Q@;aGKK}F;mCJ$p z?DitMtk(iReZ_KWuwZ``wV~>JaN-zqrAzW7Rx#F7` z`ahvKk{p)%+oyE@lt5RO$LqLHFIR&P#jTH9SReA?^Ow{?;8#m`lLy?neirOlqn{OO zXhPs;+ku>@KM*U7MZ7$%H8_FOAdF0q_edyDKZ+Edz%%rUD()utT) z!&e@bcdQ4#hLcA>{WW9{JL9IUWYoRFS2NH$W$ArTql06V@i~4n2_tHbNfr$$%({%7 zRBWE9`C{_Uxy&VTm%}gHj*(FC+Ppl!EVsnXbpsD(A9#!=fFiFV zbnNRF?iX3MYB0TU9!7yD0O6WsgqxTf{Vop~bZKo=ks-vMNnuU3y*;YtV2)Xx54_@ig85g~2bu1Tf#mgYvkYhD!*C85zN;NyM+MWt75ozf2@8srXpG zy0d)KxXXBlHq(i$UV^dRxGGa(&HdAcdlM~}e?j>5@Pd^~XA9rY63a6RjG7AL*WSitg6^^IG>kP@;|6lB`gsUT^@JiIyasW#9cn+8)QbFH(&L;Pjvpc zHWor$8ji5{!DnV^>1K#FfK}e_vjS+fse@9Q_#YA>tXoLag)q@($|m2qXNCA%%~% zCXfEvf=8zUXHgoC1#hmtD$odiom{Z@BQj7;l?Ji3LhA>Jbxcy#F@AGrC1LExt5y6k-L6_*7I!)YVm5r{sjiej(+?~$2z7!Q_E4gkW*rp%D`1%m$zV-bX3 zd|Jk+tK!lj$+Gx>t}W)BA$56)Cu_`>DYI9BOF~E?rSbC@MA%in@*BabR$pNA!%?~u zjn2$MtDG4#roX)4q?@Ee_Cuf%>Sl07Y^_3m0#IQ?m1E|-z*hK;ygd}yn$)^6P0}P+ zj{JqUaZexTfDFJS&;PfD06&`0j+8m_H)#XNJn;1wK+uwJ8_ z2O*~EbV?|CAX%r_?>FlA8f2Xd2}Qc#Hy9E3CE7|#1J5^i*UJ0erWd?RnEm=}%l#UC zO~*Z!&N&^deiAUAUczY6au>@`V~10lVu z@02o=d_mQql2u;4%qc-T?CYO^K7(eO31dw=or>b(JrV5VbN~Y3<>dUM&bFdGvFO2r z7nxmrxF&mjSVHjn9UIM8@1_(UfQNiOw=v(sYWFd3LU~d@DfPE|JC>D&aO#J8`|$Gl zfb=z8BodztZXJYZgtS2)T0Xit*7a-aEk>QR)4;($K|b87x@s=WOH&BFg;=@Zp(8#y z`MGqFdfoL3-{%4mud#gn?o#~(!GbeInlKRtcV!cQ=*sxH{RK19V=ELxwo-c;r30%5Olho=fCO+lcMFymlYWDAKXt$oQR_Bvo zGcq|vhh99WNqR4<>C1_XmQH0Kh>tZRlRd2j&19Sc&9uOqw5Fziw1gx$Vh>V14NC85 zc5m;C7z(+OPc)n_8Yn$-?eNYihEh6e85NW?u5&Qy8Wk`c#1UYT1_bYGqiVb$@Q2t+ zmq)xT#%WRbzm)xlnoHqCMe6A0UM)P1(FGNR@HI*)AGU#-0_y<+8=Fd zw_!d^QKAauptEr@e?AD|?P!4`lmXzmSMh-!b4K{s6E41A0{0O*u=$gjj(6NRvg@Ik zw-03c=?u5j{_A~;Y7e_v#4_eGWbmYXvYfufBbnP*!-lGmjnsR3j^Q2*W>#yl!SB0d zx2g!AKHXDL^OimsfB$wha))(WL^M;>#{PZLqnMW332n5_L3_la06u8{v&400`4 zlbz6?-#TrsuV_qUYzYvPTIJp{oE+9; zm^Pv5Lf@=MOGQk1nq8Iq3eF&!*Cvuu7WGxot@}q#=P}6TN1c0SzVS1<;F;VSimiL8K}S1G%i=@x1^QWV#1GzV3gj~5;HPPS$AZ*<%NHSP+MCwbJTvEy(9DH z^ED6Z`DfHOHjkM_@y69VCQk?w{A>I}*!0Q5P}>~sT4V7~(L~lSl3O~x6E~;jVCXXp ziovn)n04}+`cjpM#o*Yfu4P}^a8@O(1p)nC&Z-M5`T(?>S6b5LQ+}9QXyv9mSeY`o z+>2QDe0R^pabHPKA`&Od=EN4C`8DUcmHQ=`x-0_63aifq#X4(t2^vv|?scKO1?7Jf zY13oaB_Nn?(!cqRbs=*@a|c;WApm~IZ0r$$@x9r3F`=9Ru4iwLk>DqrLSi7slhO*)^fVwJ6JKF z97TC^gpncEebqhatCh2*wa}IFjh^?!0Jn_N(L9#Qbu}`>-L5+w&sj1?&GI8z+j5o7 zajl8A*nq`JN(gge93nPO#zbh08;gGX?8Hrt_u~}|-xX)B<}Wr?z2ZfLK4j{4ZAPP5 zE;uXji9Byc^8=(Lp-1y?*t3iFlRJj|CwzCp%&)lmPm9WDeRc-T3giGYMz)U{jUtPq zMx%nx$7#Q(HTo)bE0t2m8&4L&>R8?MQS~-MoOiQrsI{M~sGwr!tsrgwc3IxwL zO|NQx?K@(NtRG0>x2=RBSuf#->4)+T00Ko(CUV8(DPHe=LyE5RFnGFK=YPR{%G3YkKujB|{pz&mN4+G^!rgr3Zgk|6hIT9l_Yx z8$Q-_N=gdEa`7$X;vW_(-WPRntqUz6&Rp*Q(dtoAK`fCLqiHtURA-H(q3eaAO1Hvu|sUj-E5qs$EyM_Zbfk-8XF$i9DNJW zFH?PR%NSO1xkHXfP)eEmaoSdlb|=B>x4n&&mfl82|0KSz=*ehV26xkC&(y-;R9J&A zu+yS<1Oo>5;A@zb-z0}dSR7JlQ9M`CG`PG1avdRO04~J{gm68@us;0vIM0Zrt{%Y4yDXSl@)WyoPx0XQr-WZ(W??tx-=tvP!?!)! zf!8)BakS0jfRD&qyWv1(k9WLkP2V``d*&x5Mp)MG&x~){4MI#`y{mgyW$G<&i`A7b zW8_7SZXYbMA-1w;%x9g3(?RPZ)TWQV-YWq+ft0;@EeTy(pic6e-R_MjcU~?q22Cl+ zARslZ-RCI2y7_^%qJnwS`(Q7?q9OZ^g8d<2Cb3Y+p2Xj~Ej1rqUcym@HhPC%9#N5| ziM=)ji$*|2V06=-5>h-1DNPy-R4C0z%C@pESCLvG^}zVYDf%0`1)L2d+sLPU&PENA z{kn`x73pc)D+k*YL|~Y%c_C@}SQo<0OESA5>3KyURNQZeHX>MuNySoV&b^a;`__}= zmJY3V1o!5SUt|`&ypJxA^L;0Jh;*~d?KRI1Y{3=p7Y$LvQSo38rszk&Bcdw-}XmbeT6qju7?MfRD zxp01Z);bA`qDc_}5mj4oQ*_iBgqt7imci=@?%m;TiR@I`PxqW z@=X{ivb0|tQ5Y$kttl&X z%UgOYL3`{7+M5wiIo{CPc*n;88l<~|NB2Ft-r~npzqC2_JIRod^1?>KE-Jz8S$oHZzi$dV0a|5U#AR zfXHA&k$@dsb&h}G;@3;Svc!e767iuMg!akQeBNJ9h+_0q5yRX6!6B5xIN8@g?|_Kg z&rDe^i7@z#^Zb!Q`qGy`gb`ga%irB9+rhzK;|*u6wBb z|C!yBblaF2m91Yx@c5baacj5_Nmk44%?LeSx}8@OaXCM!b916jG$W@xof=I6l4iJ8 zJ2q-^c=5a*p!3fEfk9_>=EI9#slb0Qz0&#=!!a|mfbrP22AQhNVctpc(A}PzqiZ@0 zy-x}O9^}*+#)H5sALtFi4xjEyRDzb?3m89`I}WT_Jf=V!zPNir^5zJ>k+U2t?;WZD z^Pz?zhx$P!>LnpH=;gpFG$Nw8s=6qKf43BxIO90hEz&5Eybk@YQv@xJC4pw!a#-n3 zoDOnJPLb@x(P>n?}LmC!EFIoDhwIMk!pITie5Q(bZGW8Q=zY2IN;E6xR#uT7r##OO4sj)u<@yshW4?LLDzTzlD!XYun{#d*OJb&_%>Y~`dwAI z%X*KT2rvbYa%X&1!TI|%L#OccJ@Q-D1i9V>dY_BqyQg9tBe%IeZBCZOX7|Uo)>+d= zn#u~GwIM3k9sz}pV2K^_yCT|~BFSBUMQpHzj;`P-fN8x8PpIbYRZ@#Y&s2!m&_2zG z#ISNKDaJvKeBu5^%j_y-HPz|)yIQo6kKqDigx}ETBS=II`oH>YN`2}IT{e+j`FGe} zgv9uY51+RR;R)8&?_d1?+AJbnk;*guG_`9txpG_{fNDW~!|+&WZ9d0|MW9Yt$Nhr} z1a~|{Q21h2!VGBfYV&;AY`PL2@cvpOT6kN=0Q?c~eJE4*!#7J9MxM{w0EfFMW~Klg z$b9xKtaqcY zt?w83y0!yc5~fvxm6Q#X&z@+R7=(~7o!%4vYg64z+4enti7G+i;AT>g7C!I?v((^1 zAYI4nJ5Bo{tmlPBeW`WNg5_HS_qUQCR|f9Cie`&UpL2Z%j2BZP6SA>EgLpf6O8vcS z$*O5Pzui&KpWk`<@W@pu-EyWpDQ@D7{z&pq+hG_u|AvkjcU``wb7>}|{Uf=0+SRu5 zp5gu9jz(peuZ+`>kF)^x@5Mv!I2=+OVg65b{*&-!V%A~&P|JG>&_!hDnamoFd4vD#} z?<_aN?romZnfCTDv;&owni?vbF|l_4VeNVcEF*$^aD1GMnXz9=Z3RSbC1me%eKLQ~ ziY*TYLBAP8fJY=WhVW-*L`;R|YxKk>7PG2ESr{icNkQxOtgzn zbm2Q^%x->64AG%A3l6p7Ey)18g2Cy$x)zC}tdTTT8*j_V)EC@i^g`*$CZkJLDWzcb z7XKCFCqj<4yY*<=u8(YfxWfSkI~{TVf)m-^p(B~l-ue-m=0864f60Y2zXR`8=d^;4 zA{-APt{}XLz=PO(2WJmjgtG0vDP>A}#(;KtJ4;Gew$dkWjBMSEWqeS|(f0OG3rtFC zW4TuP`ROvfy1v%J-{Z|dh>_Zo8UI~W-`AhHX-}-qo-&d_w zq?Pa%YX*21Eh6Ggjc_mCl$5mGXi6F_O*zB?=5&=)Q!zPAF%~q+S1T1>>xaYuGJzSr zAj&1n#NK(+G7ja3T)YlyE&GNqsK<{fu7GK(i68n#HQN52gdGz-^(&#g`Y~c3U|bfV z8LGHvw8|1`Umz_QfnTrrOGdFl&-V@3jemS=gFrd?D!T)$-hqU)wGrqxLVe1tlVFQ4 z`73ynbFnWIPX0UZa3eq_a7xss5c)83hWXmx1?>W>4*OZKr~Z)f2A8+)IGmlXCr>IM z9bXujCEU`zAkk39*$YowRtK7G~f6ZcvY_2NdKaT^Ety4Rfw3BBXXK+KPxc*;} z4jpE*>p_eKn-JRV{lpaDcDnmHZ}tA22jb=OBoU3HPO(@g!|dz-O-lOjylSDcX-m&f z%XZ4W>6T33k8R=&-fu+J($pKvMpWJ5qyO`r9`oLoG;vFpni=s&iIrKd{4(A-!$8=% zFys?qBS2yZ<Uve*@Lrd|(K;6o&o1n{q_$aJytve!g7F4IkHIlTKah1FlM%bq2E_j0?>k}8a4!B` zy*1g>F6zCiop-|*1^oau`dKs7nIkdf&ul=M1M;@{jwjVD7*0iS7h_GaKLy1cl^riQXdi#$iRF|Sa?zXY|z(S4|-3cvn;Pn<5VNyC6K&*!CXk7IAauja^9~Fl8Q5x zq@pMK+*Fd>EP%cufxOhBsy&@E&&>64=kjlds)U4M02PnwyorEn3xZktY4<8|&& zSF;r&&9;A#+Z#> z=6xFD;TI~dwpEXKz7=DhHb2ITj2`;$Gnxp%j_yk+&b&u2LFY zOL-5Uzc2o2p(7=NSWid%?|I?A8WT-ywtfdpPn)-29++NdH3nugw{~<*1OIk@Zv;Z~ zDm(7=X(6C|dH;>RNY?V-tI_`$?g{Ieea^V(v7lZ=GyLN7+J!z-mZg5~GkF;z(Y4+V zTz^qOG&q_KQ&^V&-M2HK&PE&2?TAe>GJf4wUQ&-Pl-bg;qz!|n;UV9X_gXAy^0gr! z$eCV~{rz}v5)ZSBx9>CBvf@cM%TYeqoWc10@Fnbcs!c2;`9YY8foNdHwv)Km>LCFaK5oG_iY!*44qS!h$SM3!MLO$uePL z!jU2U6i3C-b^j`|+^vv=EjHU!M{Kv8E(7V?w7N)#h=yC0dz)ux8NL(NQ>kzeI7A>7 z@yuPzsYWdR|B*#be ziB$|ACTc6`PrlHbn_BM;yPe~cBr?dO-u66R^}V=L@~g)}qF_^b?r>^(u#hpVnVU~> z_oQr{7e6^`B5&gZw%19eGzBEhS9)67Fp_1d$;V70xNz@7fnA?_tPU^e!Rt~m@%DQI zoW=0BWC)~dl3Zn9O-~zf%pCVZVKmh{$9mPYO214&R*~+Fg1^5c2=o*jgS`@i-QYqP zBFxP{P2^cJ5DGIkiBT&t8+u^W94;{Ao95q;dR@5~oX;yh8P%vuZH@|&M52rgPrz55 zZ&0I`HfseUG#nhZgTn7X?P7UA>zB?^0rdnw<+ds_O&f_a+XO{Jm22joAKtMu8dP(T z7?whl!_yfZM>C14ZyW#>lJN)?pY*gA&N>Yk`1e$?1x3*hd&m8kxGe zQN#^#mnuSHdng<+FUgewYuEd}cTDw{cZs$9KU_iTg+ost8X)9`pS(X_@BGmEA__1h zeYd0~ERAw=CW#x#DOdRC16AygAXA*-R^L;u9sO@1=xtd*z=x2Jb5Z>HhxE?po$Pu| z)xX|fJLZ0^mvv=q;vE&1YvJrGxw?duy>)D`d7*1J*HfK55`>YA1g3Cq4-o!mlEBhJ zbg=63!pQc1$+=pxHJ9i1E3Az1L(lss$z$Ow1BS+vizxxO7j>PwAk={XX)w)TuItPFLQC4m3DfKCp^5un{$;$yoc&9K_RM~HVDR^^{Dpz!gTl*E zLuhU-WymUH`Q0RrYz(W!OKw$+@=ceP=d_ZzbquN#G$9%Gc=H~(-vAF-;4%%TzBL0~ z9yw5YBse&43y>|b_v|xL8eE>cea(-eG6YqgEbGVK!`IPb{9a@iu~u862;qI?t+M=} zLx8#lZ+zwNu6z?jr4a$n+qSTV<`_xXuHN2dd!yG?LIZC3?IaESzcFjX;`vDj_sy&6 zcLD=K)WC?x!2_K;x6Zmni?C%%4;3HKFO`AlA0cRug^Yb3 zB?DjLJVL)xVbPjNsn3y1)UB=EUl3P3f_xiI70VASKx za1bQmrkf}a#@d8fMG~Js5$~e7s~Xo1C|lzID%|HEKTgxH23q8Tq~DY(3>kTo8RGJ} z!GXprn8>KeoEU4J@`T>IVt)rEr3cnpN!;zY3|P&)F=zhw&mGT<<^sfgBL8?*IwfqI zpQ$GKSn+K6H4jMJD>V>MB)?arnXsuJdP6|esI zBls=GzCTXXTA$m6$7@wX`g$7h6b9Ah6}a^MylH^bdj>efahtP1@NP&P-1tdB95w*I zXb7aDOw1T$48iYT-p$fMpTv-;FU`2&kD`*MFO3nj)ju`sAL$HVbt1KSQ2~NWdMW{R zxbZ1fQ5}B0?}j9o7Dz778I16K0E*R!a}=8f9Dp3 zGk{`1(DFeNA3|F^-IppvlE6WN68#}`XH45A9n2Lh&#k}-0O&VV^1>-;)@6UStsXALLKwJZdn8PcWHOyb2XMy5W`ipyhX*0US2u zf(^TZI$M3m_GX7|kcBh+07^{%*i*hS$~kJw1JSSJ$9tFJ!=RVB)_YGM`y2(!W_BhS z;%Kb8nBN@FLE>6C)gHr&Jir`!3q#L9Y|GE+D)xEkxM3CLva5G@iipxYiHNAOiybv3 z)fP@moRJXr0Ch3=%<3a$TjP4NhLW7BY-~vbW^Ml?^UFDA{Z)qAm+>ZdVFL`JG{p6d z!L[w<x1k%TJFD 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