code: def encode_latent_mean(self, smiles_list):
      mol_batch = [MolTree(s) for s in smiles_list]
      for mol_tree in mol_batch:
          mol_tree.recover()
  
      _, tree_vec, mol_vec = self.encode(mol_batch)
      tree_mean = self.T_mean(tree_vec)
      mol_mean = self.G_mean(mol_vec)
      return torch.cat([tree_mean, mol_mean], dim=1)
  
imports: import torch
  import torch.nn
  from .mol_tree import Vocab, MolTree
  from .nnutils import create_var
  from .jtnn_enc import JTNNEncoder
  from .jtnn_dec import JTNNDecoder
  from .mpn import MPN, mol2graph
  from .jtmpn import JTMPN
  from .chemutils import enum_assemble, set_atommap, copy_edit_mol, attach_mols, atom_equal, decode_stereo
  import rdkit
  import rdkit.Chem
  from rdkit import DataStructs
  from rdkit.Chem import AllChem
  import copy
  import math
label_desc: Use image node_id 3 for calling the JTPropVAE obj's underlying member method code with example usage: obj.encode_latent_mean(smiles_list) and returns: torch