@@ -129,6 +129,14 @@ def _derived(self, derived=True):
129129 for par , part , reorder in PolyASParameters ._derived (self , derived ):
130130 yield (par , part , reorder )
131131
132+ def _copy (self , p ):
133+ """
134+ Copy fields to the given obejct.
135+ """
136+ PolyASParameters ._copy (self , p )
137+ if self ._has ("dismantled_schemes" ):
138+ p ._ .dismantled_schemes = self ._ .dismantled_schemes [:]
139+
132140 def _copy_cosineSequences (self , p ):
133141 """
134142 Obtain the cosine sequences from the dual eigenmatrix.
@@ -160,6 +168,16 @@ def _dismantle(self, r):
160168 scheme ._ .dismantled_schemes [:r ] = self ._ .dismantled_schemes [:r ]
161169 return scheme
162170
171+ @classmethod
172+ def _dismantlement_name (cls , r ):
173+ """
174+ Return a properly formatted name for the given dismantlement.
175+ """
176+ if r == 1 :
177+ return cls .ANTIPODAL
178+ else :
179+ return "%d-part dismantlement" % r
180+
163181 @staticmethod
164182 def _get_class ():
165183 """
@@ -188,6 +206,19 @@ def _subs(self, exp, p, seen):
188206 p ._check_parameters (p ._ .p , integral = self .DUAL_INTEGRAL ,
189207 name = self .DUAL_PARAMETER ,
190208 sym = self .DUAL_SYMBOL )
209+ if self ._has ("dismantled_schemes" ):
210+ r = min (len (self ._ .dismantled_schemes ),
211+ len (p ._ .dismantled_schemes ))
212+ for h , s in enumerate (self ._ .dismantled_schemes [:r ]):
213+ if s is None :
214+ continue
215+ name = self ._dismantlement_name (h )
216+ try :
217+ p ._ .dismantled_schemes [h ] = p .add_subscheme (
218+ self ._ .dismantled_schemes [h ].subs (* exp , seen = seen ),
219+ name )
220+ except (InfeasibleError , AssertionError ) as ex :
221+ raise InfeasibleError (ex , part = name )
191222 return p
192223
193224 def all_dismantlements (self ):
@@ -204,11 +235,13 @@ def dismantle(self, r):
204235 of a Q-antipodal association scheme.
205236 """
206237 assert self ._ .antipodal , "scheme is not Q-antipodal"
238+ assert r >= 1 , "at least one part should be kept"
207239 if is_constant (r ) and r < len (self ._ .dismantled_schemes ):
208240 scheme = self ._ .dismantled_schemes [r ]
209241 if scheme is None :
210242 scheme = self .add_subscheme (self ._dismantle (r ),
211- "%d-part dismantlement" % r )
243+ self ._dismantlement_name (r ))
244+ self ._ .dismantled_schemes [r ] = scheme
212245 else :
213246 scheme = self ._dismantle (r )
214247 return scheme
0 commit comments