def _get_sym_mappings_from_permutations(permutations, atom_list_done):

    """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)

    """

    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
def _get_sym_mappings_from_permutations ( permutations , atom_list_done ) : assert permutations . ndim == 2 num_pos = permutations . shape [ 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
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)