11import re
22import numpy
33import sympy
4+ import functools
5+
6+ from collections import defaultdict
47
58from lips .tools import flatten
69from lips .algebraic_geometry .tools import lips_covariant_symbols , lips_invariant_symbols , conversionIdeal
@@ -30,7 +33,7 @@ def __init__(self, ring_or_multiplicity, generators_or_covariants, momentum_cons
3033 oParticles .make_analytical_d ()
3134 generators = []
3235 for covariant in generators_or_covariants :
33- poly_or_polys = 4 * oParticles (covariant )
36+ poly_or_polys = 4 * oParticles (covariant ) # TODO: remove 4 * when https://github.com/sympy/sympy/pull/28139 is accepted
3437 if hasattr (poly_or_polys , 'shape' ):
3538 polys = flatten (poly_or_polys )
3639 for poly in polys :
@@ -57,7 +60,7 @@ def __contains__(self, covariant):
5760 oParticles = Particles (self .multiplicity )
5861 oParticles .make_analytical_d ()
5962 try :
60- poly_or_polys = 4 * oParticles (covariant )
63+ poly_or_polys = 4 * oParticles (covariant ) # TODO: remove 4 * when https://github.com/sympy/sympy/pull/28139 is accepted
6164 except TypeError :
6265 poly_or_polys = covariant
6366 if isinstance (poly_or_polys , numpy .ndarray ):
@@ -76,6 +79,16 @@ def image(self, rule):
7679 newIdeal .rule = rule
7780 return newIdeal
7881
82+ @functools .cached_property
83+ def equivalenceClass (self ):
84+ from ..symmetries import all_symmetries
85+ all_perms_self = {symmetry : self (* symmetry ) for symmetry in all_symmetries (self .multiplicity )}
86+ value_to_keys = defaultdict (list )
87+ for k , v in all_perms_self .items ():
88+ value_to_keys [v ].append (k )
89+ distinct_perms_self = {keys [0 ]: val for val , keys in value_to_keys .items ()}
90+ return distinct_perms_self
91+
7992 def to_mom_cons_qring (self ):
8093 oZeroIdeal = LipsIdeal (self .multiplicity , ())
8194 self .to_qring (oZeroIdeal )
0 commit comments