Skip to content

Commit 6c07a09

Browse files
committed
Handle the computed dismantlements when copying and substituting
1 parent 3fca966 commit 6c07a09

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

drg/qpoly.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)