Skip to content

Commit

Permalink
add symbols restriction in exact permutation
Browse files Browse the repository at this point in the history
  • Loading branch information
abelcarreras committed Mar 22, 2024
1 parent 1673754 commit 968a829
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 15 deletions.
19 changes: 8 additions & 11 deletions posym/operations/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,20 +145,17 @@ def apply_op(permut, base):
return True

len_orbits = Permutation(permutation).len_orbits()
if sum(np.mod(self._order, len_orbits)) == 0:
self._permutation = permutation
return True
vector = np.ones_like(len_orbits)
vector = np.multiply(vector, np.mod(self._order, len_orbits))

if self._determinant < 0:
allowed_orbits = [2, self._order, self._order * 2]

vector = np.ones_like(len_orbits)
for o in np.unique(allowed_orbits):
vector = np.multiply(vector, np.mod(o, len_orbits))
vector = np.multiply(vector, np.mod(self._order*2, len_orbits))
if self._order != 2:
vector = np.multiply(vector, np.mod(2, len_orbits))

if np.sum(vector) == 0:
self._permutation = permutation
return True
if np.sum(vector) == 0:
self._permutation = permutation
return True

return None

Expand Down
23 changes: 19 additions & 4 deletions posym/operations/permutation.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,22 +75,37 @@ def generate_permutation_set(generators, symbols):

n_atoms = len(symbols)

def gen_perm(n_atoms, gen):
def symbols_compatible(len_orbits):
val = 1
for lo in len_orbits:
val *= len(np.unique(np.array(symbols)[lo]))
if val == 1:
return True
return False

def gen_perm(gen):
order = gen._order
determinant = gen._determinant
for p in permutations(range(n_atoms)):
len_orbits = Permutation(p).len_orbits()
p_object = Permutation(p)
len_orbits = p_object.len_orbits()
orbits = p_object.get_orbits()

# check symbols restriction
if not symbols_compatible(orbits):
continue

orbit_mod = np.ones_like(len_orbits)
orbit_mod = np.multiply(orbit_mod, np.mod(order, len_orbits))

if determinant < 0:
orbit_mod = np.multiply(orbit_mod, np.mod(2, len_orbits))
orbit_mod = np.multiply(orbit_mod, np.mod(2 * order, len_orbits))
if order != 2:
orbit_mod = np.multiply(orbit_mod, np.mod(2, len_orbits))

if np.sum(orbit_mod) == 0:
yield p

# for perm_set in product(*gen_perm_list):
for perm_set in product(*[gen_perm(n_atoms, gen) for gen in generators]):
for perm_set in product(*[gen_perm(gen) for gen in generators]):
yield {k: pi for k, pi in zip(generators, perm_set)}

0 comments on commit 968a829

Please sign in to comment.