diff --git a/.gitignore b/.gitignore index c3e17c0..53f83f5 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,9 @@ *.log /src/* *egg-info +*.out +*.error +*.npy +*.txt +*.png +*.svg diff --git a/Notebooks/HTF_CG_Demo.ipynb b/Notebooks/HTF_CG_Demo.ipynb new file mode 100644 index 0000000..a4f9378 --- /dev/null +++ b/Notebooks/HTF_CG_Demo.ipynb @@ -0,0 +1,10824 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "#os.environ['CUDA_VISIBLE_DEVICES'] = '-1'\n", + "import networkx as nx\n", + "import tensorflow as tf\n", + "from tensorflow.keras import layers\n", + "import hoomd\n", + "import hoomd.md\n", + "import hoomd.htf as htf\n", + "import numpy as np\n", + "import gsd\n", + "import gsd.hoomd\n", + "import pickle\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "notice(2): Group \"all\" created containing 88 particles\n" + ] + } + ], + "source": [ + "# building a HTF model for coarse graining\n", + "# here use the single-molecule file for simplicity\n", + "# TODO: update to get one molecule from a .gsd with multiple\n", + "# e.g. grab first entry in htf.find_molecules(system) -> do the rest\n", + "fname = '1-length-4-peek-para-only.gsd'\n", + "gsdfile = gsd.hoomd.open(fname)\n", + "context = hoomd.context.initialize('--mode=cpu')\n", + "system = hoomd.init.read_gsd(filename=fname)\n", + "context.sorter.disable()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Finding molecules...\r", + "Finding molecules...0.00%\n" + ] + } + ], + "source": [ + "molecule_mapping_index = htf.find_molecules(system)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(1, 0), (1, 87), (2, 1), (3, 2), (4, 86), (4, 3), (4, 5), (5, 6), (6, 7), (6, 85), (7, 8), (8, 9), (9, 10), (9, 84), (10, 12), (10, 11), (12, 83), (12, 13), (13, 14), (14, 81), (14, 15), (15, 16), (16, 17), (16, 80), (17, 18), (18, 19), (19, 79), (19, 20), (20, 21), (21, 78), (21, 22), (22, 23), (23, 24), (24, 77), (24, 25), (25, 26), (25, 27), (27, 28), (27, 76), (28, 29), (29, 30), (29, 74), (30, 31), (31, 32), (31, 73), (32, 33), (33, 34), (34, 72), (34, 35), (35, 36), (36, 71), (36, 37), (37, 38), (38, 39), (39, 40), (39, 70), (40, 41), (40, 42), (42, 69), (42, 43), (43, 44), (44, 67), (44, 45), (45, 46), (46, 47), (46, 66), (47, 48), (48, 49), (49, 50), (49, 65), (50, 51), (51, 52), (51, 64), (52, 53), (53, 54), (54, 63), (54, 55), (55, 57), (55, 56), (57, 62), (57, 58), (58, 59), (59, 60), (60, 61), (61, 62), (63, 64), (65, 66), (67, 68), (68, 69), (70, 71), (72, 73), (74, 75), (75, 76), (77, 78), (79, 80), (81, 82), (82, 83), (84, 85), (86, 87)]\n", + "[{0, 1, 2, 3, 4, 86, 87}, {5, 6, 7, 8, 9, 84, 85}, {10, 11, 12, 13, 14, 81, 82, 83}, {15, 16, 17, 18, 80, 79, 19}, {77, 78, 20, 21, 22, 23, 24}, {74, 75, 76, 25, 26, 27, 28, 29}, {32, 33, 34, 72, 73, 30, 31}, {35, 36, 37, 70, 71, 38, 39}, {67, 68, 69, 40, 41, 42, 43, 44}, {65, 66, 45, 46, 47, 48, 49}, {64, 50, 51, 52, 53, 54, 63}, {55, 56, 57, 58, 59, 60, 61, 62}] 12\n", + "\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "graph = nx.Graph()\n", + "# add all our particles and bonds\n", + "for particle in system.particles:\n", + " graph.add_node(particle.tag, name=particle.type)\n", + "for bond in system.bonds:\n", + " graph.add_edge(bond.a, bond.b)\n", + "plt.figure()\n", + "plt.title('BEFORE')\n", + "nx.draw(graph, with_labels=True)\n", + "# judiciously snip bonds\n", + "degrees_dict = dict(graph.degree())\n", + "\n", + "print([(item.a, item.b) for item in list(system.bonds)])\n", + "\n", + "for i, bond in enumerate(system.bonds):\n", + " if bond.type == 'c-ca' or bond.type == 'ca-c':\n", + " if degrees_dict[bond.a] == 3 and degrees_dict[bond.b] == 3:\n", + " graph.remove_edge(bond.a, bond.b)\n", + " elif bond.type == 'ca-os' or bond.type == 'os-ca':\n", + " if degrees_dict[bond.a] == 2 and degrees_dict[bond.b] == 3 or\\\n", + " degrees_dict[bond.a] == 3 and degrees_dict[bond.b] == 2:\n", + " graph.remove_edge(bond.a, bond.b)\n", + " degrees_dict = dict(graph.degree())\n", + "\n", + "subgraph_list = list(nx.connected_components(graph))\n", + "print(subgraph_list, len(subgraph_list))\n", + "print(type(subgraph_list[0]))\n", + "plt.figure()\n", + "plt.title('AFTER')\n", + "nx.draw(graph, with_labels=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "N_atoms: 88 \n", + "N_molecules: 1 \n", + "N_atoms_per_molecule: 88\n", + "12\n" + ] + } + ], + "source": [ + "# now we have our beads grouped up, we need to get their mapping\n", + "# get total N atoms\n", + "N = sum([len(m) for m in molecule_mapping_index])\n", + "# get molecule count\n", + "M = len(molecule_mapping_index)\n", + "# atoms per molecule\n", + "MN = len(molecule_mapping_index[0])\n", + "print('N_atoms:', N,'\\nN_molecules:', M,'\\nN_atoms_per_molecule:', MN)\n", + "# make sure we didn't miss any particles\n", + "assert(sum([len(item) for item in subgraph_list]) == MN)\n", + "print(len(subgraph_list))" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "N_atoms: 88 \n", + "N_molecules: 1 \n", + "N_atoms_per_molecule: 88\n" + ] + } + ], + "source": [ + "# create a mapping for our molecules\n", + "# these are 4-monomer polymers, and we're doing 3 beads per monomer\n", + "# therefore, we need a 12 x 88 matrix\n", + "\n", + "\n", + "mapping_arr = np.zeros((12,MN))\n", + "\n", + "for i, subgraph in enumerate(subgraph_list):\n", + " for atom_idx in subgraph:\n", + " mapping_arr[i][atom_idx] = 1\n", + " \n", + "N = sum([len(m) for m in molecule_mapping_index])\n", + "# get molecule count\n", + "M = len(molecule_mapping_index)\n", + "# atoms per molecule\n", + "MN = len(molecule_mapping_index[0])\n", + "print('N_atoms:', N,'\\nN_molecules:', M,'\\nN_atoms_per_molecule:', MN)\n", + "# again make sure we didn't miss any atoms\n", + "assert(np.sum(mapping_arr) == MN)\n", + "\n", + "bead_number = mapping_arr.shape[0]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "notice(2): Group \"all\" created containing 8800 particles\n", + "Finding molecules...99.00%\n", + "N_atoms: 8800 \n", + "N_molecules: 100 \n", + "N_atoms_per_molecule: 88\n" + ] + } + ], + "source": [ + "fname = '100-length-4-peek-para-only-production.gsd'\n", + "gsdfile = gsd.hoomd.open(fname)\n", + "context = hoomd.context.initialize('--mode=cpu')\n", + "system = hoomd.init.read_gsd(filename=fname)\n", + "context.sorter.disable()\n", + "set_rcut = 11.0\n", + "molecule_mapping_index = htf.find_molecules(system)\n", + "\n", + "cg_mapping = htf.sparse_mapping([mapping_arr for _ in molecule_mapping_index],\n", + " molecule_mapping_index, system=system)\n", + "N = sum([len(m) for m in molecule_mapping_index])\n", + "# get molecule count\n", + "M = len(molecule_mapping_index)\n", + "# atoms per molecule\n", + "MN = len(molecule_mapping_index[0])\n", + "print('N_atoms:', N,'\\nN_molecules:', M,'\\nN_atoms_per_molecule:', MN)\n", + "assert cg_mapping.shape == (M * bead_number, N)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[15.995788 15.995788 15.995788 90. 90. 90. ] 100-length-4-peek-para-only-production.gsd\n" + ] + } + ], + "source": [ + "import MDAnalysis as mda\n", + "univ = mda.Universe(fname)\n", + "print(univ.dimensions, fname)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'c', 'ca', 'o', 'oh', 'os'}" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "set(univ.atoms.types)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0. 0. 0. ... 0. 0. 0.]\n", + " [0. 1. 0. ... 0. 0. 0.]\n", + " [0. 0. 1. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 1. 0. 0.]\n", + " [0. 0. 0. ... 0. 1. 0.]\n", + " [0. 0. 0. ... 0. 0. 1.]]\n" + ] + } + ], + "source": [ + "adjacency_matrix = np.eye(M*12)\n", + "for i in range(M*12):\n", + " if i % 12 == 0:\n", + " adjacency_matrix[i][i] = 0\n", + "class TrajModel(htf.SimModel):\n", + " def setup(self, CG_NN, cg_mapping, rcut):\n", + " self.CG_NN = CG_NN\n", + " self.cg_mapping = cg_mapping\n", + " self.rcut = rcut\n", + " def compute(self, nlist, positions, box):\n", + " # calculate the center of mass of a CG bead\n", + " box_size = htf.box_size(box)\n", + " mapped_pos = htf.center_of_mass(positions=positions[:,:3],\n", + " mapping=self.cg_mapping, \n", + " box_size=[16.,16.,16.])\n", + " print('made it past to mapped_pos')\n", + " #cg_graph = htf.compute_cg_graph(DSGPM=False,\n", + " # infile=None,\n", + " # adj_mat=adjacency_matrix,\n", + " # cg_beads=M*12)\n", + " return mapped_pos, box, box_size\n", + "nneighbor_cutoff = 32\n", + "model = TrajModel(nneighbor_cutoff,\n", + " CG_NN = nneighbor_cutoff,\n", + " cg_mapping=cg_mapping,\n", + " output_forces=False,\n", + " rcut=set_rcut,\n", + " check_nlist=False)\n", + "print(adjacency_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100\n", + "[[ 0. 1.]\n", + " [ 1. 2.]\n", + " [ 2. 3.]\n", + " [ 3. 4.]\n", + " [ 4. 5.]\n", + " [ 5. 6.]\n", + " [ 6. 7.]\n", + " [ 7. 8.]\n", + " [ 8. 9.]\n", + " [ 9. 10.]\n", + " [10. 11.]\n", + " [12. 13.]\n", + " [13. 14.]\n", + " [14. 15.]\n", + " [15. 16.]\n", + " [16. 17.]\n", + " [17. 18.]\n", + " [18. 19.]\n", + " [19. 20.]\n", + " [20. 21.]\n", + " [21. 22.]\n", + " [22. 23.]\n", + " [24. 25.]\n", + " [25. 26.]]\n", + "[[1086. 1087.]\n", + " [1087. 1088.]\n", + " [1088. 1089.]\n", + " [1089. 1090.]\n", + " [1090. 1091.]\n", + " [1092. 1093.]\n", + " [1093. 1094.]\n", + " [1094. 1095.]\n", + " [1095. 1096.]\n", + " [1096. 1097.]\n", + " [1097. 1098.]\n", + " [1098. 1099.]\n", + " [1099. 1100.]\n", + " [1100. 1101.]\n", + " [1101. 1102.]\n", + " [1102. 1103.]\n", + " [1104. 1105.]\n", + " [1105. 1106.]\n", + " [1106. 1107.]\n", + " [1107. 1108.]\n", + " [1108. 1109.]\n", + " [1109. 1110.]\n", + " [1110. 1111.]\n", + " [1111. 1112.]\n", + " [1112. 1113.]\n", + " [1113. 1114.]\n", + " [1114. 1115.]\n", + " [1116. 1117.]\n", + " [1117. 1118.]\n", + " [1118. 1119.]\n", + " [1119. 1120.]\n", + " [1120. 1121.]\n", + " [1121. 1122.]\n", + " [1122. 1123.]\n", + " [1123. 1124.]\n", + " [1124. 1125.]\n", + " [1125. 1126.]\n", + " [1126. 1127.]\n", + " [1128. 1129.]\n", + " [1129. 1130.]\n", + " [1130. 1131.]\n", + " [1131. 1132.]\n", + " [1132. 1133.]\n", + " [1133. 1134.]\n", + " [1134. 1135.]\n", + " [1135. 1136.]\n", + " [1136. 1137.]\n", + " [1137. 1138.]\n", + " [1138. 1139.]\n", + " [1140. 1141.]\n", + " [1141. 1142.]\n", + " [1142. 1143.]\n", + " [1143. 1144.]\n", + " [1144. 1145.]\n", + " [1145. 1146.]\n", + " [1146. 1147.]\n", + " [1147. 1148.]\n", + " [1148. 1149.]\n", + " [1149. 1150.]\n", + " [1150. 1151.]\n", + " [1152. 1153.]\n", + " [1153. 1154.]\n", + " [1154. 1155.]\n", + " [1155. 1156.]\n", + " [1156. 1157.]\n", + " [1157. 1158.]\n", + " [1158. 1159.]\n", + " [1159. 1160.]\n", + " [1160. 1161.]\n", + " [1161. 1162.]\n", + " [1162. 1163.]\n", + " [1164. 1165.]\n", + " [1165. 1166.]\n", + " [1166. 1167.]\n", + " [1167. 1168.]\n", + " [1168. 1169.]\n", + " [1169. 1170.]\n", + " [1170. 1171.]\n", + " [1171. 1172.]\n", + " [1172. 1173.]\n", + " [1173. 1174.]\n", + " [1174. 1175.]\n", + " [1176. 1177.]\n", + " [1177. 1178.]\n", + " [1178. 1179.]\n", + " [1179. 1180.]\n", + " [1180. 1181.]\n", + " [1181. 1182.]\n", + " [1182. 1183.]\n", + " [1183. 1184.]\n", + " [1184. 1185.]\n", + " [1185. 1186.]\n", + " [1186. 1187.]\n", + " [1188. 1189.]\n", + " [1189. 1190.]\n", + " [1190. 1191.]\n", + " [1191. 1192.]\n", + " [1192. 1193.]\n", + " [1193. 1194.]\n", + " [1194. 1195.]\n", + " [1195. 1196.]\n", + " [1196. 1197.]\n", + " [1197. 1198.]\n", + " [1198. 1199.]]\n", + "Applying CG mapping to 100-length-4-peek-para-only-production.gsd\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "beads_per_molecule = 12\n", + "bonds_per_molecule = beads_per_molecule - 1 # linear polymer\n", + "bonds_matrix = np.zeros([bonds_per_molecule * M, 2])\n", + "#print(M)\n", + "bonds_matrix[0][1] = 1\n", + "offset = 0\n", + "\n", + "for i in range(1, bonds_matrix.shape[0]):\n", + " bonds_matrix[i][0] = i + i//11\n", + " bonds_matrix[i][1] = i+1 + i//11\n", + " \n", + "def make_frame(i, positions):\n", + " s = gsd.hoomd.Snapshot()\n", + " s.configuration.box = [16.,16.,16., 0., 0., 0.]\n", + " s.configuration.step = i\n", + " s.particles.N = beads_per_molecule * M\n", + " s.particles.position = positions\n", + " s.bonds.N = bonds_per_molecule * M\n", + " s.bonds.group = bonds_matrix\n", + " #print(s)\n", + " return s\n", + "\n", + "print(f'Applying CG mapping to {fname}')\n", + "f = gsd.hoomd.open(name=f'CG_traj-{fname}', mode='wb+')\n", + "i = 0\n", + "for inputs, ts in htf.iter_from_trajectory(nneighbor_cutoff, univ, r_cut=set_rcut):\n", + " #print(i)\n", + " i+=1\n", + " result = model(inputs)\n", + " #print(result[0], np.array(result[0].shape))\n", + " particle_positions = np.array(result[0])\n", + " f.append(make_frame(i, particle_positions))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "start_idx = 0\n", + "\n", + "ccrdf = model.avg_ccrdf.result().numpy()\n", + "plt.figure()\n", + "plt.plot(ccrdf[1, start_idx:], ccrdf[0, start_idx:], label='C-C', color='C1')\n", + "plt.title(r'C-C RDF')\n", + "plt.xlabel(r'r')\n", + "plt.ylabel(r'g(r)')\n", + "plt.legend()\n", + "plt.show()\n", + "\n", + "cordf = model.avg_cordf.result().numpy()\n", + "plt.figure()\n", + "plt.plot(ccrdf[1, start_idx:], cordf[0, start_idx:], label='C-O', color='C1')\n", + "plt.title(r'C-O RDF')\n", + "plt.xlabel(r'r')\n", + "plt.ylabel(r'g(r)')\n", + "plt.legend()\n", + "plt.show()\n", + "\n", + "cordf = model.avg_oordf.result().numpy()\n", + "plt.figure()\n", + "plt.plot(ccrdf[1, start_idx:], cordf[0, start_idx:], label='C-O', color='C1')\n", + "plt.title(r'C-O RDF')\n", + "plt.xlabel(r'r')\n", + "plt.ylabel(r'g(r)')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "uli-htf", + "language": "python", + "name": "uli-htf" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Notebooks/HTF_CG_Demo.py b/Notebooks/HTF_CG_Demo.py new file mode 100644 index 0000000..92e6701 --- /dev/null +++ b/Notebooks/HTF_CG_Demo.py @@ -0,0 +1,409 @@ +import os +#os.environ['CUDA_VISIBLE_DEVICES'] = '-1' +import networkx as nx +import tensorflow as tf +from tensorflow.keras import layers +import hoomd +import hoomd.md +import hoomd.htf as htf +import numpy as np +import gsd +import gsd.hoomd +import pickle +import matplotlib.pyplot as plt +import os + +# building a HTF model for coarse graining +# here use the single-molecule file for simplicity +# TODO: break this file up into a few scripts +# e.g. one for making mapping, one for running from traj... +# TODO: once saving is set, get pipeline for starting a sim fresh with uli-init +# TODO: either calculate per-bead forces, or try just matching energies + +def get_mol_mapping_idx(filename): + '''Takes a filename of a .gsd file WITHOUT the '.gsd', loads that gsd, + then loads or creates a molecule mapping index from it.''' + # if the mapping doesn't exist, make it + gsdfile = gsd.hoomd.open(f'{filename}.gsd') + context = hoomd.context.initialize('--mode=cpu') + system = hoomd.init.read_gsd(filename=f'{filename}.gsd') + context.sorter.disable() + if not os.path.exists(f'{filename}-mapping.npy'): + molecule_mapping_index = htf.find_molecules(system) + np.save(f'{filename}-mapping.npy', np.array(molecule_mapping_index)) + # if it does, load from it instead + else: + molecule_mapping_index = np.load(f'{filename}-mapping.npy') + return system, molecule_mapping_index + +one_molecule_fname = '1-length-4-peek-para-only' +system, molecule_mapping_index = get_mol_mapping_idx(one_molecule_fname) + +graph = nx.Graph() +# add all our particles and bonds +for particle in system.particles: + graph.add_node(particle.tag, name=particle.type) +for bond in system.bonds: + graph.add_edge(bond.a, bond.b) +plt.figure() +plt.title('BEFORE') +nx.draw(graph, with_labels=True) +plt.savefig('before.png') +# judiciously snip bonds +degrees_dict = dict(graph.degree()) + +for i, bond in enumerate(system.bonds): + if bond.type == 'c-ca' or bond.type == 'ca-c': + if degrees_dict[bond.a] == 3 and degrees_dict[bond.b] == 3: + graph.remove_edge(bond.a, bond.b) + elif bond.type == 'ca-os' or bond.type == 'os-ca': + if degrees_dict[bond.a] == 2 and degrees_dict[bond.b] == 3 or\ + degrees_dict[bond.a] == 3 and degrees_dict[bond.b] == 2: + graph.remove_edge(bond.a, bond.b) + degrees_dict = dict(graph.degree()) + +subgraph_list = list(nx.connected_components(graph)) +plt.figure() +plt.title('AFTER') +nx.draw(graph, with_labels=True) +plt.savefig('after.png') + +# now we have our beads grouped up, we need to get their mapping +# get total N atoms +N = sum([len(m) for m in molecule_mapping_index]) +# get molecule count +M = len(molecule_mapping_index) +# atoms per molecule +MN = len(molecule_mapping_index[0]) +print('N_atoms:', N,'\nN_molecules:', M,'\nN_atoms_per_molecule:', MN) +# make sure we didn't miss any particles +assert(sum([len(item) for item in subgraph_list]) == MN) + +# create a mapping for our molecules +# these are 4-monomer polymers, and we're doing 3 beads per monomer +# therefore, we need a 12 x 88 matrix + + +mapping_arr = np.zeros((12,MN)) + +for i, subgraph in enumerate(subgraph_list): + for atom_idx in subgraph: + mapping_arr[i][atom_idx] = 1 + +N = sum([len(m) for m in molecule_mapping_index]) +# get molecule count +M = len(molecule_mapping_index) +# atoms per molecule +MN = len(molecule_mapping_index[0]) +# again make sure we didn't miss any atoms +assert(np.sum(mapping_arr) == MN) + +bead_number = mapping_arr.shape[0] + +set_rcut = 11.0 +fname = '100-length-4-peek-para-only-production' +system, molecule_mapping_index = get_mol_mapping_idx(fname) + +cg_mapping = htf.sparse_mapping([mapping_arr for _ in molecule_mapping_index], + molecule_mapping_index, system=system) +N = sum([len(m) for m in molecule_mapping_index]) +# get molecule count +M = len(molecule_mapping_index) +# atoms per molecule +MN = len(molecule_mapping_index[0]) +print('N_atoms:', N,'\nN_molecules:', M,'\nN_atoms_per_molecule:', MN) +assert cg_mapping.shape == (M * bead_number, N) + +import MDAnalysis as mda +univ = mda.Universe('100-length-4-peek-para-only-production.gsd') + +# create an edge list +beads_per_molecule = 12 +bonds_per_molecule = beads_per_molecule - 1 # linear polymer +bonds_matrix = np.zeros([bonds_per_molecule * M, 2]) +bonds_matrix[0][1] = 1 +offset = 0 + +# this puts the indices of bonded beads as pairs +# i.e. the edge list of a graph +for i in range(1, bonds_matrix.shape[0]): + bonds_matrix[i][0] = i + i//11 + bonds_matrix[i][1] = i+1 + i//11 + +# make adjacency matrix (N_beads x N_beads) +# adj_mat[i][j] = 0 if beads (i, j) not bonded, 1 if they are +adjacency_matrix = np.zeros([M * 12, M * 12]) +for pair in bonds_matrix: + i, j = int(pair[0]), int(pair[1]) + adjacency_matrix[i][j] = adjacency_matrix[j][i] = 1 + +# create Lennard-Jones energy-calculating layer +class LJLayer(tf.keras.layers.Layer): + def __init__(self, sigma, epsilon): + super().__init__(self, name='lj') + self.start_vals = [sigma, epsilon] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([sigma, epsilon]), + constraint=tf.keras.constraints.NonNeg() + ) + # call takes only particle radii (pass in from neighbor list) + # returns energy contribution from LJ interactions + def call(self, r): + r6 = tf.math.divide_no_nan(self.w[0]**6, r**6) + energy = self.w[1] * 4.0 * (r6**2 - r6) + # divide by 2 to avoid double-counting + return energy / 2. + +class BondLayer(tf.keras.layers.Layer): + # harmonic bond potential + def __init__(self, k_b, r0): + # we only have one bond type, so we only need one k & r0 + super().__init__(self, name='bonds') + # set initial values for bond spring constant (k_b) and equilibrium length (r0) + self.start = [k_b, r0] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([k_b, r0]), + constraint=tf.keras.constraints.NonNeg() + ) + + def call(self, r): + energy = self.w[0] * (r - self.w[1])**2 + # don't divide by 2 here because we are doing per-bond (not neighbor-list-based) + return energy + +class AngleLayer(tf.keras.layers.Layer): + # harmonic angle potential + def __init__(self, k_a, theta0): + # only one angle type, so we only need one k & theta0 + super().__init__(self, name='angles') + # set initial values for angle spring constant (k) and equilibrium theta + self.start = [k_a, theta0] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([k_a, theta0]), + constraint=tf.keras.constraints.NonNeg() + ) + def call(self, theta): + energy = self.w[0] * (theta - self.w[1])**2 + return energy + +class DihedralLayer(tf.keras.layers.Layer): + # harmonic cosine potential + def __init__(self, k_d, phi0): + # only one type of dihedral, so we only need one k & phi0 + super().__init__(self, name='dihedrals') + # set initial values for dihedral spring constant (k) and equilibrium phi + self.start = [k_d, phi0] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([k_d, phi0]), + constraint=tf.keras.constraints.NonNeg() + ) + def call(self, phi): + energy = self.w[0] * (tf.math.cos(phi) - tf.math.cos(self.w[1]))**2 + return energy + +class TrajModel(htf.SimModel): + def setup(self, cg_num, adjacency_matrix, CG_NN, cg_mapping, rcut): + self.cg_num = cg_num + self.adjacency_matrix = adjacency_matrix + self.CG_NN = CG_NN + self.cg_mapping = cg_mapping + self.rcut = rcut + self.avg_cg_rdf = tf.keras.metrics.MeanTensor() # set up CG RDF tracking + + self.avg_cg_radii = tf.keras.metrics.MeanTensor() + self.avg_cg_angles = tf.keras.metrics.MeanTensor() + self.avg_cg_dihedrals = tf.keras.metrics.MeanTensor() + + # energy layers + self.lj_energy = LJLayer(1., 1.) + # just a guess at bond length + self.bond_energy = BondLayer(1., 2.) + self.angle_energy = AngleLayer(1., 3.14/2.) + self.dihedral_energy = DihedralLayer(1., 3.14/2.) + + def compute(self, nlist, positions, box): + # calculate the center of mass of a CG bead + box_size = htf.box_size(box) # [16., 16., 16.] + mapped_pos = htf.center_of_mass(positions=positions[:,:3], + mapping=self.cg_mapping, + box_size= box_size) + cg_features = htf.compute_cg_graph(DSGPM=False, + infile=None, + adj_mat=self.adjacency_matrix, + cg_beads=self.cg_num) + + radii_tensor = [] + angles_tensor = [] + dihedrals_tensor = [] + + # because these are tensors, can't use list comprehension + for i in range(len(cg_features[0])): + cg_radius = htf.mol_bond_distance(CG=True, + cg_positions=mapped_pos, + b1=cg_features[0][i][0], + b2=cg_features[0][i][1] + ) + radii_tensor.append(cg_radius) + self.avg_cg_radii.update_state(radii_tensor) + + for j in range(len(cg_features[1])): + cg_angle = htf.mol_angle(CG=True, + cg_positions=mapped_pos, + b1=cg_features[1][j][0], + b2=cg_features[1][j][1], + b3=cg_features[1][j][2] + ) + angles_tensor.append(cg_angle) + self.avg_cg_angles.update_state(angles_tensor) + + for k in range(len(cg_features[2])): + cg_dihedral = htf.mol_dihedral(CG=True, + cg_positions=mapped_pos, + b1=cg_features[2][k][0], + b2=cg_features[2][k][1], + b3=cg_features[2][k][2], + b4=cg_features[2][k][3], + ) + dihedrals_tensor.append(cg_dihedral) + self.avg_cg_dihedrals.update_state(dihedrals_tensor) + + # create mapped neighbor list + mapped_nlist = htf.compute_nlist(mapped_pos, self.rcut, self.CG_NN, box_size, True) + # compute RDF for mapped particles + cg_rdf = htf.compute_rdf(mapped_nlist, [0.1, self.rcut]) + self.avg_cg_rdf.update_state(cg_rdf) + + # now calculate our total energy and train + nlist_r = htf.safe_norm(tensor=nlist[:, :, :3], axis=2) + lj_energy = self.lj_energy(nlist_r) + lj_energy_total = tf.reduce_sum(input_tensor=lj_energy, axis=1) + bonds_energy = self.bond_energy(radii_tensor) + angles_energy = self.angle_energy(angles_tensor) + dihedrals_energy = self.dihedral_energy(dihedrals_tensor) + subtotal_energy = tf.reduce_sum(bonds_energy) + tf.reduce_sum(angles_energy) + tf.reduce_sum(dihedrals_energy) + lj_forces = htf.compute_nlist_forces(nlist, lj_energy_total) + other_forces = htf.compute_positions_forces(positions=mapped_pos, energy=subtotal_energy) + total_energy = lj_energy + subtotal_energy + return lj_forces + other_forces, mapped_pos, total_energy, radii_tensor, angles_tensor, dihedrals_tensor + +nneighbor_cutoff = 32 +model = TrajModel(nneighbor_cutoff, + cg_num=12, # beads per molecule, not total + adjacency_matrix=adjacency_matrix, + CG_NN=nneighbor_cutoff, + cg_mapping=cg_mapping, + output_forces=False, + rcut=set_rcut, + check_nlist=False) + +# for writing out the CG trajectory +def make_frame(i, positions): + s = gsd.hoomd.Snapshot() + s.configuration.box = [16., 16., 16., 0., 0., 0.] + s.configuration.step = i + s.particles.N = beads_per_molecule * M + s.particles.position = positions + s.bonds.N = bonds_per_molecule * M + s.bonds.group = bonds_matrix + return s + +write_CG_traj = False + +avg_bond_lengths = [] +avg_bond_angles = [] +avg_dihedral_angles = [] + +if write_CG_traj: + print(f'Applying CG mapping to {fname}') + f = gsd.hoomd.open(name=f'CG-traj-{fname}.gsd', mode='wb+') + +# get our potential energies from the log file +logfile = f'{fname}.log' +print(f'Reading energies from {logfile}') +with open(logfile, 'r') as f: + header = f.readline() +potential_energy_idx = header.split('\t').index('potential_energy') +log_data = np.genfromtxt(logfile, skip_header=1) +potential_energies = log_data[:, potential_energy_idx] +energy_stride = 10 #int(log_data[:,0][1] - log_data[:,0][0]) + +i = 0 # index over gsd timesteps +j = 0 # index over energy steps (since we didn't write energy every frame) + +# all the 'None' here is so we only train on the energy +model.compile('Adam', ['MeanSquaredError', None, None, None, None, None]) +losses = [] + +# set up training data and get the raw mapped statistics +inputs_list = [] +for inputs, ts in htf.iter_from_trajectory(nneighbor_cutoff, univ, r_cut=set_rcut): + if i % energy_stride == 0: + #labels = ts # TODO: iterate through the corresponding log file for our energies + # only grab neighbor list, positions, and box + inputs_list.append([np.array(item) for item in inputs]) + result = model(inputs) + particle_positions = np.array(result[0]) + avg_bond_lengths.append(result[2]) + avg_bond_angles.append(result[3]) + avg_dihedral_angles.append(result[4]) + if write_CG_traj: + f.append(make_frame(i, particle_positions)) + j += 1 + i+=1 + +try: + np.save('inputs.npy', np.array(inputs_list)) +except: + print('failed to save inputs') + +history = model.fit(x=inputs_list, y=potential_energies)# model.train_on_batch(x=inputs_list, y=potential_energies) + +cg_rdf = model.avg_cg_rdf.result().numpy() + +plt.figure() +plt.plot(cg_rdf[1,:], cg_rdf[0,:], label='Mapped (CG)') +plt.xlabel('r [$\AA$]') +plt.ylabel('$g(r)$') +plt.legend() +plt.savefig('CG_RDF.svg') + +# plot average CG bond radii +cg_radii = model.avg_cg_radii.result().numpy() + +np.save('cg_radii.npy', np.array(avg_bond_lengths)) + +# plt.figure() +# plt.hist(np.array(avg_bond_lengths)) +# plt.xlabel('r [$\AA$]') +# plt.ylabel('Count') +# plt.title('CG Bond Length Histogram') +# plt.legend() +# plt.savefig('CG_Radii.svg') + +# plot average CG bond angles +# cg_radii = model.avg_cg_angles.result().numpy() + +np.save('cg_angles.npy', np.array(avg_bond_angles)) + +# plt.figure() +# plt.plot(cg_radii[1,:], cg_radii[0,:], label='Mapped (CG)') +# plt.xlabel('$\theta$ [Degrees(?)]') +# plt.ylabel('$g(r)$?') +# plt.legend() +# plt.savefig('CG_Angles.svg') + +# plot average CG dihedral angles +# cg_radii = model.avg_cg_dihedrals.result().numpy() + +np.save('cg_dihedrals.npy', np.array(avg_dihedral_angles)) + +# plt.figure() +# plt.plot(cg_radii[1,:], cg_radii[0,:], label='Mapped (CG)') +# plt.xlabel('$\phi$ [Degrees?]') +# plt.ylabel('$g(r)$?') +# plt.legend() +# plt.savefig('CG_Radii.svg') \ No newline at end of file diff --git a/Notebooks/HTF_Online_CG_Demo.py b/Notebooks/HTF_Online_CG_Demo.py new file mode 100644 index 0000000..bb14723 --- /dev/null +++ b/Notebooks/HTF_Online_CG_Demo.py @@ -0,0 +1,373 @@ +import os +import networkx as nx +import tensorflow as tf +from tensorflow.keras import layers +import hoomd +import hoomd.md +import hoomd.htf as htf +import numpy as np +import gsd +from uli_init.simulate import Simulation +from uli_init.system import System + +# building an HTF model for coarse graining + +def get_mol_mapping_idx(filename): + '''Takes a filename of a .gsd file WITHOUT the '.gsd', loads that gsd, + then loads or creates a molecule mapping index from it.''' + # if the mapping doesn't exist, make it + context = hoomd.context.initialize('--mode=gpu') + system = hoomd.init.read_gsd(filename=f'{filename}.gsd') + context.sorter.disable() + if not os.path.exists(f'{filename}-mapping.npy'): + molecule_mapping_index = htf.find_molecules(system) + np.save(f'{filename}-mapping.npy', molecule_mapping_index) + # if it does, load from it instead + else: + molecule_mapping_index = np.load(f'{filename}-mapping.npy') + return system, molecule_mapping_index + +# Steps to do HOOMD-TF: +# 1) build HOOMD-TF keras model +# 2) compile keras model +# 3) create tfcompute object from model +# 4) set up HOOMD simulation (uli-init code) +# 5) pass in model to uli-init Simulation object +# 7) run the hoomd simulation (call the quench method) + +one_molecule_fname = '1-length-4-peek-para-only' +system, molecule_mapping_index = get_mol_mapping_idx(one_molecule_fname) + +graph = nx.Graph() +# add all our particles and bonds +for particle in system.particles: + graph.add_node(particle.tag, name=particle.type) +for bond in system.bonds: + graph.add_edge(bond.a, bond.b) +# judiciously snip bonds +degrees_dict = dict(graph.degree()) + +for i, bond in enumerate(system.bonds): + if bond.type == 'c-ca' or bond.type == 'ca-c': + if degrees_dict[bond.a] == 3 and degrees_dict[bond.b] == 3: + graph.remove_edge(bond.a, bond.b) + elif bond.type == 'ca-os' or bond.type == 'os-ca': + if degrees_dict[bond.a] == 2 and degrees_dict[bond.b] == 3 or\ + degrees_dict[bond.a] == 3 and degrees_dict[bond.b] == 2: + graph.remove_edge(bond.a, bond.b) + degrees_dict = dict(graph.degree()) + +subgraph_list = list(nx.connected_components(graph)) + +# now we have our beads grouped up, we need to get their mapping +# get total N atoms +N = sum([len(m) for m in molecule_mapping_index]) +# get molecule count +M = len(molecule_mapping_index) +# atoms per molecule +MN = len(molecule_mapping_index[0]) +print('N_atoms:', N,'\nN_molecules:', M,'\nN_atoms_per_molecule:', MN) +# make sure we didn't miss any particles +assert(sum([len(item) for item in subgraph_list]) == MN) + +# create a mapping for our molecules +# these are 4-monomer polymers, and we're doing 3 beads per monomer +# therefore, we need a 12 x 88 matrix + + +mapping_arr = np.zeros((12,MN)) + +for i, subgraph in enumerate(subgraph_list): + for atom_idx in subgraph: + mapping_arr[i][atom_idx] = 1 + +N = sum([len(m) for m in molecule_mapping_index]) +# get molecule count +M = len(molecule_mapping_index) +# atoms per molecule +MN = len(molecule_mapping_index[0]) +# again make sure we didn't miss any atoms +assert(np.sum(mapping_arr) == MN) + +bead_number = mapping_arr.shape[0] + +set_rcut = 2.0 +n_molecules = 100 +n_monomers = 4 +fname = f'{n_molecules}-length-{n_monomers}-peek-para-only-production' +system, molecule_mapping_index = get_mol_mapping_idx(fname) + +cg_mapping = htf.sparse_mapping([mapping_arr for _ in molecule_mapping_index], + molecule_mapping_index, system=system) +N = sum([len(m) for m in molecule_mapping_index]) +# get molecule count +M = len(molecule_mapping_index) +# atoms per molecule +MN = len(molecule_mapping_index[0]) +print('N_atoms:', N,'\nN_molecules:', M,'\nN_atoms_per_molecule:', MN) +assert cg_mapping.shape == (M * bead_number, N) + +# create an edge list +beads_per_molecule = 12 +bonds_per_molecule = beads_per_molecule - 1 # linear polymer +bonds_matrix = np.zeros([bonds_per_molecule * M, 2]) +bonds_matrix[0][1] = 1 +offset = 0 + +# this puts the indices of bonded beads as pairs +# i.e. the edge list of a graph +for i in range(1, bonds_matrix.shape[0]): + bonds_matrix[i][0] = i + i//11 + bonds_matrix[i][1] = i+1 + i//11 + +# make adjacency matrix (N_beads x N_beads) +# adj_mat[i][j] = 0 if beads (i, j) not bonded, 1 if they are +adjacency_matrix = np.zeros([M * 12, M * 12]) +for pair in bonds_matrix: + i, j = int(pair[0]), int(pair[1]) + adjacency_matrix[i][j] = adjacency_matrix[j][i] = 1 + +# create Lennard-Jones energy-calculating layer +class LJLayer(tf.keras.layers.Layer): + def __init__(self, sigma, epsilon): + super().__init__(self, name='lj') + self.start_vals = [sigma, epsilon] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([sigma, epsilon]), + constraint=tf.keras.constraints.NonNeg() + ) + # call takes only particle radii (pass in from neighbor list) + # returns energy contribution from LJ interactions + def call(self, r): + r6 = tf.math.divide_no_nan(self.w[0]**6, r**6) + energy = self.w[1] * 4.0 * (r6**2 - r6) + # divide by 2 to avoid double-counting + return energy / 2. + +class BondLayer(tf.keras.layers.Layer): + # harmonic bond potential + def __init__(self, k_b, r0): + # we only have one bond type, so we only need one k & r0 + super().__init__(self, name='bonds') + # set initial values for bond spring constant (k_b) and equilibrium length (r0) + self.start = [k_b, r0] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([k_b, r0]), + constraint=tf.keras.constraints.NonNeg() + ) + + def call(self, r): + energy = self.w[0] * (r - self.w[1])**2 + # don't divide by 2 here because we are doing per-bond (not neighbor-list-based) + return energy + +class AngleLayer(tf.keras.layers.Layer): + # harmonic angle potential + def __init__(self, k_a, theta0): + # only one angle type, so we only need one k & theta0 + super().__init__(self, name='angles') + # set initial values for angle spring constant (k) and equilibrium theta + self.start = [k_a, theta0] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([k_a, theta0]), + constraint=tf.keras.constraints.NonNeg() + ) + def call(self, theta): + energy = self.w[0] * (theta - self.w[1])**2 + return energy + +class DihedralLayer(tf.keras.layers.Layer): + # harmonic cosine potential + def __init__(self, k_d, phi0): + # only one type of dihedral, so we only need one k & phi0 + super().__init__(self, name='dihedrals') + # set initial values for dihedral spring constant (k) and equilibrium phi + self.start = [k_d, phi0] + self.w = self.add_weight( + shape=[2], + initializer=tf.constant_initializer([k_d, phi0]), + constraint=tf.keras.constraints.NonNeg() + ) + def call(self, phi): + energy = self.w[0] * (tf.math.cos(phi) - tf.math.cos(self.w[1]))**2 + return energy + +class TrajModel(htf.SimModel): + def setup(self, cg_num, adjacency_matrix, + CG_NN, r_cut, dtype=tf.float32): + self.cg_num = cg_num + self.adjacency_matrix = adjacency_matrix + self.CG_NN = CG_NN + self.r_cut = r_cut + #self.avg_cg_rdf = tf.keras.metrics.MeanTensor() # set up CG RDF tracking + + self.avg_cg_radii = tf.keras.metrics.MeanTensor() + self.avg_cg_angles = tf.keras.metrics.MeanTensor() + self.avg_cg_dihedrals = tf.keras.metrics.MeanTensor() + + # energy layers + self.lj_energy = LJLayer(1., 1.) + # just a guess at bond length + self.bond_energy = BondLayer(1., 2.) + self.angle_energy = AngleLayer(1., 3.14/2.) + self.dihedral_energy = DihedralLayer(1., 3.14/2.) + self.cg_features = htf.compute_cg_graph(DSGPM=False, + infile=None, + adj_mat=self.adjacency_matrix, + cg_beads=self.cg_num) + + + def compute(self, nlist, positions, box): + # calculate the center of mass of a CG bead + box_size = htf.box_size(box) # [16., 16., 16.] + cg_features = self.cg_features + # angles_list = [] + # dihedrals_list = [] + + # because these are tensors, can't use list comprehension + # b1 and b2 come from tuple returned by compute_cg_graph, + # so need single idx first, but we can slice the tensor + cg_radii = htf.mol_bond_distance(CG=True, + cg_positions=positions[:,:3], + b1=cg_features[0][:, 0], + b2=cg_features[0][:, 1], + box=box) + self.avg_cg_radii.update_state(cg_radii) + + cg_angles = htf.mol_angle(CG=True, + cg_positions=positions[:,:3], + b1=cg_features[1][:, 0], + b2=cg_features[1][:, 1], + b3=cg_features[1][:, 2], + box=box) + self.avg_cg_angles.update_state(cg_angles) + + cg_dihedrals = htf.mol_dihedral(CG=True, + cg_positions=positions[:,:3], + b1=cg_features[2][:, 0], + b2=cg_features[2][:, 1], + b3=cg_features[2][:, 2], + b4=cg_features[2][:, 3], + box=box) + self.avg_cg_dihedrals.update_state(cg_dihedrals) + + # create mapped neighbor list + mapped_nlist = nlist# htf.compute_nlist(mapped_pos, self.rcut, self.CG_NN, box_size, True) + # compute RDF for mapped particles + # cg_rdf = htf.compute_rdf(mapped_nlist, [0.1, self.rcut]) + # self.avg_cg_rdf.update_state(cg_rdf) + + # now calculate our total energy and train + nlist_r = htf.safe_norm(tensor=mapped_nlist[:, :, :3], axis=2) + lj_energy = self.lj_energy(nlist_r) # TODO: something is going on with these indices. + lj_energy_total = tf.reduce_sum(input_tensor=lj_energy, axis=1) + bonds_energy = self.bond_energy(cg_radii) + angles_energy = self.angle_energy(cg_angles) + dihedrals_energy = self.dihedral_energy(cg_dihedrals) + subtotal_energy = tf.reduce_sum(bonds_energy) + tf.reduce_sum(angles_energy) + tf.reduce_sum(dihedrals_energy) + lj_forces = htf.compute_nlist_forces(mapped_nlist, lj_energy_total) + other_forces = htf.compute_positions_forces(positions=positions, energy=subtotal_energy) + total_energy = lj_energy + subtotal_energy + # return lj_forces + other_forces, mapped_pos, total_energy, cg_radii, cg_angles, cg_dihedrals + # TODO: see if we can plot loss over time, get final loss + return lj_forces + other_forces, positions, total_energy, self.lj_energy.w, self.bond_energy.w, self.angle_energy.w, self.dihedral_energy.w + +nneighbor_cutoff = 64 + +model = TrajModel(nneighbor_cutoff=nneighbor_cutoff, + cg_num=12, # beads per molecule, not total + adjacency_matrix=adjacency_matrix, + CG_NN=nneighbor_cutoff, + output_forces=False, + r_cut=set_rcut, + check_nlist=False) + +# all the 'None' here is so we only train on the energy +optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001) +model.compile(optimizer, ['MeanAbsoluteError', None, None, None, None, None]) + +sim_system = System(system_type='pack', molecule='PEEK', para_weight=1.0, + density=1.2, n_compounds=[n_molecules], + polymer_lengths=[n_monomers], forcefield='gaff', + assert_dihedrals=True, remove_hydrogens=True) + +# hacky workaround needing box in htf utils function +def center_of_mass_no_box(positions, mapping, name='center-of-mass'): + ''' Computes mapped positions given positions and system-level mapping + by considering PBC. + :param positions: The tensor of particle positions + :type positions: N x 3 tensor + :param mapping: The coarse-grain system-level mapping used to produce + the particles in system + :type mapping: M x N tensor + :param name: The name of the op to add to the TF graph + :type name: string + :return: An [M x 3] mapped particles + ''' + + try: + sorting = hoomd.context.current.sorter.enabled + if sorting: + raise ValueError( + 'You must disable hoomd sorting to use center_of_mass!') + except AttributeError: + pass + + # slice to avoid accidents + positions = positions[:, :3] + # https://en.wikipedia.org/wiki/ + # /Center_of_mass#Systems_with_periodic_boundary_conditions + # Adapted for -L to L boundary conditions + # box dim in hoomd is 2 * L + # make a pretend box just around our particles + xmin, xmax = min(positions[:, 0]), max(positions[:, 0]) + ymin, ymax = min(positions[:, 1]), max(positions[:, 1]) + zmin, zmax = min(positions[:, 2]), max(positions[:, 2]) + print(f'\n\nBOX: [ [{xmin}, {ymin}, {zmin}], [{xmax}, {ymax}, {zmax}] ]') + box_dim = [xmax - xmin, ymax - ymin, zmax - zmin] + theta = positions / box_dim * 2 * np.pi + xi = tf.math.cos(theta) + zeta = tf.math.sin(theta) + ximean = tf.sparse.sparse_dense_matmul(mapping, xi) + zetamean = tf.sparse.sparse_dense_matmul(mapping, zeta) + thetamean = tf.math.atan2(zetamean, ximean) + return tf.identity(thetamean / np.pi / 2 * box_dim, name=name) + +def get_cg_positions(aa_positions, box_dims): + mapped_positions_raw = htf.center_of_mass( + positions=aa_positions, + mapping=cg_mapping, + box_size=tf.cast(box_dims, tf.float32) + ) + print(f'\n\nIN get_cg_positions mapped_positions_raw is {mapped_positions_raw}\n\n') + cg_pos_input = tf.concat([mapped_positions_raw, tf.ones((mapped_positions_raw.shape[0], 1), dtype=mapped_positions_raw.dtype)], axis=-1, name='cg-pos-input') + print(f'RETURNING {cg_pos_input}') + np.save('aa_positions.npy', aa_positions) + np.save('cg_positions_mapped.npy', mapped_positions_raw) + return cg_pos_input + +sim = Simulation(sim_system, gsd_write=1, mode='gpu', dt=0.005, r_cut=set_rcut, + tf_model=model, mapping_func=get_cg_positions, tf_batch_size=4) + +#sim = Simulation(sim_system, gsd_write=1e4, mode='gpu', dt=0.0001, r_cut=set_rcut) + +sim.quench(kT=1., n_steps=5e5, shrink_steps=1e3, shrink_kT=1., shrink_period=1e4) + + +#outputs = sim.tfcompute.outputs +#cg_positions = outputs[0] +#np.save('cg_positions.npy', cg_positions) +#cg_energy = outputs[1] +#np.save('cg_energy.npy', cg_energy) +#lj_energy_params = outputs[2] +#np.save('cg_lj_params.npy', lj_energy_params) +#bond_energy_params = outputs[3] +#np.save('cg_bond_params.npy', bond_energy_params) +#angle_energy_params = outputs[4] +#np.save('cg_angle_params.npy', angle_energy_params) +#dihedral_energy_params = outputs[5] +#np.save('cg_dihedral_params.npy', dihedral_energy_params) + diff --git a/Notebooks/make_fg_traj.py b/Notebooks/make_fg_traj.py new file mode 100644 index 0000000..02bea12 --- /dev/null +++ b/Notebooks/make_fg_traj.py @@ -0,0 +1,16 @@ +'''This script is uses uli_init to generate initial positions + that are loaded in for the HTF_Online_Demo.py script. + The output of this simulation must be renamed to correspond + with the number of polymers and polymer sizes you wish to use.''' + +import uli_init.simulate as simulate +import uli_init.system as system +import hoomd + +system = system.System(molecule='PEEK', para_weight=1.0, system_type='pack', + density=0.8, n_compounds=[100], + polymer_lengths=[4], forcefield='gaff', + assert_dihedrals=True, remove_hydrogens=True) + +sim = simulate.Simulation(system, gsd_write=1, mode='gpu', dt=0.0001) +sim.quench(kT=1., n_steps=1, shrink_steps=1, shrink_kT=1.0, shrink_period=1) diff --git a/Notebooks/plot_CG_results.py b/Notebooks/plot_CG_results.py new file mode 100644 index 0000000..fced96b --- /dev/null +++ b/Notebooks/plot_CG_results.py @@ -0,0 +1,79 @@ +import numpy as np +import matplotlib.pyplot as plt +import hoomd +import gsd.hoomd +import glob +import sys + +if(len(sys.argv) != 2): + print("Error: you must pass the number of particles") + exit(1) + +param_fnames = sorted(glob.glob("*params.npy")) +print(param_fnames) + +# plot our parameters over time +for fname in param_fnames: + params = np.load(fname) + short_name = fname.split('.')[0] # discard file extension + # first dimension is timesteps + plt.figure() + for i, param in enumerate(params[0]): + plt.plot(range(params.shape[0]), params[:,i], label=f'{short_name}[{i}]') + plt.legend() + plt.xlabel('Steps') + plt.ylabel(short_name) + plt.savefig(f'{short_name}.png') + +M = int(sys.argv[1] ) +# create an edge list +beads_per_molecule = 12 +bonds_per_molecule = beads_per_molecule - 1 # linear polymer +bonds_matrix = np.zeros([bonds_per_molecule * M, 2]) # TODO: read the number, not hard-code 100 +bonds_matrix[0][1] = 1 +offset = 0 + +# this puts the indices of bonded beads as pairs +# i.e. the edge list of a graph +for i in range(1, bonds_matrix.shape[0]): + bonds_matrix[i][0] = i + i//11 + bonds_matrix[i][1] = i+1 + i//11 + + +# for writing out the CG trajectory +def make_frame(i, positions, bonds_matrix): + s = gsd.hoomd.Snapshot() + s.configuration.box = [16., 16., 16., 0., 0., 0.] + s.configuration.step = i + s.particles.N = beads_per_molecule * M + s.particles.position = positions + s.bonds.N = bonds_per_molecule * M + s.bonds.group = bonds_matrix + return s + +angle_params = np.load(param_fnames[0]) +bond_params = np.load(param_fnames[1]) +dihedral_params = np.load(param_fnames[2]) +lj_params = np.load(param_fnames[3]) + +log_data = np.genfromtxt('sim_traj.log', skip_header=1) +with open('sim_traj.log', 'r') as f: + headers = f.readline().replace('#','').replace('\n','').split('\t') +potential_idx = headers.index('potential_energy') +potential = log_data[:, potential_idx] +plt.figure() +plt.plot(np.arange(len(potential)), potential) +plt.xlabel('Timestep') +plt.ylabel('Potential Energy') +plt.savefig('potential.png') + + +positions = np.load('cg_positions.npy') +positions = positions[:,:,:3] # remove types + +gsdfile = gsd.hoomd.open(name=f'cg_trajectory.gsd', mode='wb+') + +for i in range(positions.shape[0]): + this_pos = positions[i] + frame = make_frame(i, this_pos, bonds_matrix) + gsdfile.append(frame) diff --git a/environment-nohoomd.yml b/environment-nohoomd.yml index 1d952da..95c72e3 100644 --- a/environment-nohoomd.yml +++ b/environment-nohoomd.yml @@ -11,6 +11,7 @@ dependencies: - parmed>=3.4.0 - pip=21.0 - pytest + - mdanalysis - pytest-cov - python=3.7 - rdkit=2021.03.1 @@ -18,5 +19,5 @@ dependencies: - signac=1.6.0 - signac-flow=0.12.0 - pip: - - git+https://github.com/chrisjonesBSU/mbuild.git@origin/fix/axis_transform + - git+https://github.com/mosdef-hub/mbuild - git+https://github.com/cmelab/uli-init.git@0.2.0 diff --git a/environment.yml b/environment.yml index ea380f7..eaec96d 100644 --- a/environment.yml +++ b/environment.yml @@ -12,6 +12,7 @@ dependencies: - parmed>=3.4.0 - pip=21.0 - pytest + - mdanalysis - pytest-cov - python=3.7 - rdkit=2021.03.1 @@ -19,5 +20,5 @@ dependencies: - signac=1.6.0 - signac-flow=0.12.0 - pip: - - git+https://github.com/chrisjonesBSU/mbuild.git@origin/fix/axis_transform + - git+https://github.com/mosdef-hub/mbuild - git+https://github.com/cmelab/uli-init.git@0.2.0 diff --git a/uli_init/simulate.py b/uli_init/simulate.py index b73903b..58f2420 100644 --- a/uli_init/simulate.py +++ b/uli_init/simulate.py @@ -42,8 +42,11 @@ def __init__( gsd_write=1e4, log_write=1e3, seed=42, + tf_model = None, + mapping_func = None, + tf_nlist_check_period = 100, + tf_batch_size = None ): - self.system_pmd = system.system # Parmed structure self.r_cut = r_cut self.e_factor = e_factor @@ -57,6 +60,16 @@ def __init__( self.gsd_write = gsd_write self.log_write = log_write self.seed = seed + self.tf_model = tf_model # pass in a TF model here + self.mapping_func = mapping_func # should computes CG positions from AA + self.tf_nlist_check_period = tf_nlist_check_period # how often to ask HTF to update its nlist + self.tf_batch_size = tf_batch_size + + if tf_model is not None: + # only import this if we're using TF + import hoomd.htf as htf + # TODO: check if model is compiled already, error out if not + self.tfcompute = htf.tfcompute(tf_model) if ref_units and not auto_scale: self.ref_energy = ref_units["energy"] @@ -124,9 +137,50 @@ def quench( self.auto_scale, nlist=self.nlist ) + hoomd_nlist = objs[2] hoomd_system = objs[1] init_snap = objs[0] - _all = hoomd.group.all() + + if self.tf_model is not None: + assert self.mapping_func is not None,\ + "If you are doing coarse-graining, you must \ + provide a mapping function (see HTF)" + # save real atom types from initial snapshot + aa_type_list = hoomd_system.particles.get_metadata()['types'] + sim.sorter.disable() + aa_group, cg_group = self.tfcompute.enable_mapped_nlist( + hoomd_system, + self.mapping_func) + test_cg_snapshot = hoomd_system.take_snapshot(bonds=True) + #TODO: looks like setting the snap positions wasn't enough. Need to call htf.tf2hoomd before model setup? + print('\n\nBEFORE') + print(f'test_cg_snap positions: {test_cg_snapshot.particles.position}') + print(f'cg_group: {cg_group}, {dir(cg_group)}') + hoomd.run(0) + print('\n\nAFTER') + print(f'test_cg_snap positions: {test_cg_snapshot.particles.position}') + print(f'cg_group: {cg_group}, {dir(cg_group)}') + #mb.formats.gsdwriter.write_gsd(test_snapshot, 'test_snapshot.gsd') + hoomd.dump.gsd('test_cg_snap.gsd', period=None, group=cg_group) + hoomd.dump.gsd('test_aa_snap.gsd', period=None, group=aa_group) + hoomd.dump.gsd('test_full_system_snap.gsd', period=None, group=hoomd.group.all()) + # grab the LJ interactions from mbuild + lj = objs[3] + # get the cg bead type + all_types = hoomd_system.particles.get_metadata()['types'] + cg_types = list(set(all_types) - set(aa_type_list)) + lj.pair_coeff.set(cg_types, all_types, r_cut=self.r_cut, epsilon=0., sigma=0.) + _all = aa_group + hoomd.dump.gsd( + 'cg_traj.gsd', + period=self.gsd_write, + group=cg_group, + phase=0, + dynamic=['momentum'], + overwrite=False + ) + else: + _all = hoomd.group.all() hoomd.md.integrate.mode_standard(dt=self.dt) hoomd.dump.gsd( @@ -135,7 +189,7 @@ def quench( group=_all, phase=0, dynamic=["momentum"], - overwrite=False, + overwrite=False ) hoomd.analyze.log( "sim_traj.log", @@ -143,7 +197,7 @@ def quench( quantities=self.log_quantities, header_prefix="#", overwrite=True, - phase=0, + phase=0 ) if len([i for i in (shrink_kT, shrink_steps) if i is None]) == 1: raise ValueError( @@ -197,6 +251,13 @@ def quench( epsilon=1.0, r_extrap=0 ) + if self.tf_model is not None: + wall_force.force_coeff.set( + cg_types, + sigma=1.0, + epsilon=1.0, + r_extrap=0 + ) step = 0 start = time.time() while step < shrink_steps: @@ -226,7 +287,7 @@ def quench( phase=0, dynamic=["momentum"] ) - # Run the primary simulation + if pressure: try: # Not defined if no shrink step integrator.disable() @@ -247,7 +308,16 @@ def quench( group=_all, tau=self.tau_kt, kT=kT) - integrator.randomize_velocities(seed=self.seed) + integrator.randomize_velocities(seed=self.seed) + if self.tf_model is not None: + self.tfcompute.attach( + hoomd_nlist, + train=True, + r_cut=self.r_cut, + save_output_period=self.tf_nlist_check_period, + batch_size=self.tf_batch_size + ) + try: hoomd.run(n_steps) except hoomd.WalltimeLimitReached: diff --git a/uli_init/system.py b/uli_init/system.py index fcb701f..63a2a9c 100644 --- a/uli_init/system.py +++ b/uli_init/system.py @@ -120,7 +120,7 @@ def __init__( "n_compounds and polymer_lengths should be equal length" ) - init = Initialize(system=self, **kwargs) + init = Initializer(system=self, **kwargs) self.system = init.system def sample_from_pdi( @@ -219,7 +219,7 @@ def _recover_mass_dist(self, distribution="weibull"): return mass_dict -class Initialize: +class Initializer: def __init__(self, system, **kwargs): self.system = system if system.type == "pack":