code: def _get_sym_mappings_from_permutations(permutations, atom_list_done):
  
      
  
      assert permutations.ndim == 2
      num_pos = permutations.shape[1]
  
      # filled with -1
      map_atoms = np.zeros((num_pos,), dtype='intc') - 1
      map_syms = np.zeros((num_pos,), dtype='intc') - 1
  
      atom_list_done = set(atom_list_done)
      for atom_todo in range(num_pos):
          for (sym_index, permutation) in enumerate(permutations):
              if permutation[atom_todo] in atom_list_done:
                  map_atoms[atom_todo] = permutation[atom_todo]
                  map_syms[atom_todo] = sym_index
                  break
          else:
              text = ("Input forces are not enough to calculate force constants,"
                      "or something wrong (e.g. crystal structure does not "
                      "match).")
              print(textwrap.fill(text))
              raise ValueError
  
      assert set(map_atoms) & set(atom_list_done) == set(map_atoms)
      assert -1 not in map_atoms
      assert -1 not in map_syms
      return map_atoms, map_syms
docs: This can be thought of as computing 'map_atom_disp' and 'map_sym'
      for all atoms, except done using permutations instead of by
      computing overlaps.
  
      Input:
          * permutations, shape [num_rot][num_pos]
          * atom_list_done
  
      Output:
          * map_atoms, shape [num_pos].
          Maps each atom in the full structure to its equivalent atom in
          atom_list_done.  (each entry will be an integer found in
          atom_list_done)
  
          * map_syms, shape [num_pos].
          For each atom, provides the index of a rotation that maps it
          into atom_list_done.  (there might be more than one such
          rotation, but only one will be returned) (each entry will be
          an integer 0 <= i < num_rot)