code: String[] symbolicTypes(final IAtomContainer container, final int[][] graph, final EdgeToBondMap bonds, final Set<IBond> mmffArom) {
  
          // Array of symbolic types, MMFF refers to these as 'SYMB' and the numeric
          // value a s 'TYPE'.
          final String[] symbs = new String[container.getAtomCount()];
  
          checkPreconditions(container);
  
          assignPreliminaryTypes(container, symbs);
  
          // aromatic types, set by upgrading preliminary types in specified positions
          // and conditions. This requires a fair bit of code and is delegated to a separate class.
          aromaticTypes.assign(container, symbs, bonds, graph, mmffArom);
  
          // special case, 'NCN+' matches entries that the validation suite say should
          // actually be 'NC=N'. We can achieve 100% compliance by checking if NCN+ is still
          // next to CNN+ or CIM+ after aromatic types are assigned
          fixNCNTypes(symbs, graph);
  
          assignHydrogenTypes(container, symbs, graph);
  
          return symbs;
      }
docs: Obtain the MMFF symbolic types to the atoms of the provided structure.
  
  @param container structure representation
  @param graph     adj list data structure
  @param bonds     bond lookup map
  @param mmffArom  flags which bonds are aromatic by MMFF model
  @return MMFF symbolic types for each atom index