Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
Faster _calc_vacancy_number and phi. Cythonized RiggedPartition.
Browse files Browse the repository at this point in the history
  • Loading branch information
tscrim committed Nov 8, 2017
1 parent 82bc1fb commit 65df5a1
Show file tree
Hide file tree
Showing 5 changed files with 216 additions and 80 deletions.
15 changes: 11 additions & 4 deletions src/sage/combinat/rigged_configurations/rc_crystal.py
Expand Up @@ -270,10 +270,13 @@ def _calc_vacancy_number(self, partitions, a, i, **options):
"""
vac_num = self._wt[self.index_set()[a]]

for b in range(self._cartan_matrix.ncols()):
for b,nu in enumerate(partitions):
val = self._cartan_matrix[a,b]
if val:
vac_num -= val * partitions[b].get_num_cells_to_column(i)
if i == float('inf'):
vac_num -= val * sum(nu)
else:
vac_num -= val * nu.get_num_cells_to_column(i)

return vac_num

Expand Down Expand Up @@ -358,11 +361,15 @@ def _calc_vacancy_number(self, partitions, a, i, **options):
ia = I[a]
vac_num = self._wt[ia]

if i == float('inf'):
return vac_num - sum(self._cartan_matrix[a,b] * sum(nu)
for b,nu in enumerate(partitions))

gamma = self._folded_ct.scaling_factors()
g = gamma[ia]
for b in range(self._cartan_matrix.ncols()):
for b, nu in enumerate(partitions):
ib = I[b]
q = partitions[b].get_num_cells_to_column(g*i, gamma[ib])
q = nu.get_num_cells_to_column(g*i, gamma[ib])
vac_num -= self._cartan_matrix[a,b] * q / gamma[ib]

return vac_num
Expand Down
14 changes: 9 additions & 5 deletions src/sage/combinat/rigged_configurations/rc_infinity.py
Expand Up @@ -261,12 +261,12 @@ def _calc_vacancy_number(self, partitions, a, i, **options):
sage: RC._calc_vacancy_number(elt.nu(), 0, 1)
-1
"""
vac_num = 0
if i == float('inf'):
return -sum(self._cartan_matrix[a,b] * sum(nu)
for b,nu in enumerate(partitions))

for b in range(self._cartan_matrix.ncols()):
vac_num -= self._cartan_matrix[a,b] * partitions[b].get_num_cells_to_column(i)

return vac_num
return -sum(self._cartan_matrix[a,b] * nu.get_num_cells_to_column(i)
for b,nu in enumerate(partitions))

# FIXME: Remove this method!!!
def weight_lattice_realization(self):
Expand Down Expand Up @@ -380,6 +380,10 @@ def _calc_vacancy_number(self, partitions, a, i):
ia = I[a]
vac_num = 0

if i == float('inf'):
return -sum(self._cartan_matrix[a,b] * sum(nu)
for b,nu in enumerate(partitions))

gamma = self._folded_ct.scaling_factors()
g = gamma[ia]
for b in range(self._cartan_matrix.ncols()):
Expand Down
38 changes: 27 additions & 11 deletions src/sage/combinat/rigged_configurations/rigged_configurations.py
Expand Up @@ -810,8 +810,12 @@ def _calc_vacancy_number(self, partitions, a, i, **options):
if dim[0] == self._rc_index[a]:
vac_num += min(dim[1], i)

for b in range(self._cartan_matrix.ncols()):
vac_num -= self._cartan_matrix[a,b] * partitions[b].get_num_cells_to_column(i)
if i == float('inf'):
vac_num -= sum(self._cartan_matrix[a,b] * sum(nu)
for b,nu in enumerate(partitions))
else:
vac_num -= sum(self._cartan_matrix[a,b] * nu.get_num_cells_to_column(i)
for b,nu in enumerate(partitions))

return vac_num

Expand Down Expand Up @@ -1146,11 +1150,15 @@ def _calc_vacancy_number(self, partitions, a, i, **options):
if dim[0] == self._rc_index[a]:
vac_num += min(dim[1], i)

gamma = self._folded_ct.scaling_factors()
for b in range(self._cartan_matrix.ncols()):
vac_num -= (self._cartan_matrix[a,b]
* partitions[b].get_num_cells_to_column(gamma[a+1]*i, gamma[b+1])
// gamma[b+1])
if i == float('inf'):
vac_num -= sum(self._cartan_matrix[a,b] * sum(nu)
for b,nu in enumerate(partitions))
else:
gamma = self._folded_ct.scaling_factors()
vac_num -= sum(self._cartan_matrix[a,b]
* nu.get_num_cells_to_column(gamma[a+1]*i, gamma[b+1])
// gamma[b+1]
for b,nu in enumerate(partitions))

return vac_num

Expand Down Expand Up @@ -1492,8 +1500,12 @@ def _calc_vacancy_number(self, partitions, a, i, **options):
vac_num += min(dim[1], i)

gamma = self._folded_ct.scaling_factors()
for b in range(self._cartan_matrix.ncols()):
vac_num -= self._cartan_matrix[a,b] * partitions[b].get_num_cells_to_column(i) // gamma[b+1]
if i == float('inf'):
vac_num -= sum(self._cartan_matrix[a,b] * sum(nu) // gamma[b+1]
for b, nu in enumerate(partitions))
else:
vac_num -= sum(self._cartan_matrix[a,b] * nu.get_num_cells_to_column(i) // gamma[b+1]
for b, nu in enumerate(partitions))

return vac_num

Expand Down Expand Up @@ -1640,8 +1652,12 @@ def _calc_vacancy_number(self, partitions, a, i, **options):
if dim[0] == self._rc_index[a]:
vac_num += min(dim[1], i)

for b in range(self._cartan_matrix.ncols()):
vac_num -= self._cartan_matrix[a,b] * partitions[b].get_num_cells_to_column(i) / 2
if i == float('inf'):
vac_num -= sum(self._cartan_matrix[a,b] * sum(nu) / 2
for b,nu in enumerate(partitions))
else:
vac_num -= sum(self._cartan_matrix[a,b] * nu.get_num_cells_to_column(i) / 2
for b,nu in enumerate(partitions))

return vac_num

Expand Down
15 changes: 15 additions & 0 deletions src/sage/combinat/rigged_configurations/rigged_partition.pxd
@@ -0,0 +1,15 @@
from sage.structure.sage_object cimport SageObject

cdef class RiggedPartition(SageObject):
cdef public list _list
cdef public list vacancy_numbers
cdef public list rigging
cdef long _hash

cpdef get_num_cells_to_column(self, int end_column, t=*)
cpdef insert_cell(self, int max_width)
cpdef remove_cell(self, row, int num_cells=*)

cdef class RiggedPartitionTypeB(RiggedPartition):
pass

0 comments on commit 65df5a1

Please sign in to comment.