@@ -59,7 +59,8 @@ def __next__(self):
5959 def __init__ (self ,
6060 charges : np .ndarray ,
6161 charge_labels : Optional [np .ndarray ] = None ,
62- charge_types : Optional [List [Type ["BaseCharge" ]]] = None ) -> None :
62+ charge_types : Optional [List [Type ["BaseCharge" ]]] = None ,
63+ charge_dtype : Optional [Type [np .number ]] = np .int16 ) -> None :
6364 if charges .ndim == 1 :
6465 charges = charges [None , :]
6566
@@ -68,20 +69,25 @@ def __init__(self,
6869 "`len(charge_types) = {}` does not match `charges.shape[0]={}`"
6970 .format (len (charge_types ), charges .shape [0 ]))
7071
72+ if charges .shape [0 ] <= 3 :
73+ label_dtype = np .int16
74+ else :
75+ label_dtype = np .int32
7176 self .charge_types = charge_types
7277 if charge_labels is None :
7378 if charges .shape [1 ] > 0 :
7479 self .unique_charges , self .charge_labels = np .unique (
75- charges .astype (np . int16 ), return_inverse = True , axis = 1 )
76- self .charge_labels = self .charge_labels .astype (np . int16 )
80+ charges .astype (charge_dtype ), return_inverse = True , axis = 1 )
81+ self .charge_labels = self .charge_labels .astype (label_dtype )
7782 else :
78- self .unique_charges = np .empty ((charges .shape [0 ], 0 ), dtype = np .int16 )
79- self .charge_labels = np .empty (0 , dtype = np .int16 )
83+ self .unique_charges = np .empty ((charges .shape [0 ], 0 ),
84+ dtype = charge_dtype )
85+ self .charge_labels = np .empty (0 , dtype = label_dtype )
8086 else :
81- self .charge_labels = np .asarray (charge_labels , dtype = np . int16 )
87+ self .charge_labels = np .asarray (charge_labels , dtype = label_dtype )
8288
83- self .unique_charges = charges .astype (np . int16 )
84- self .charge_labels = charge_labels .astype (np . int16 )
89+ self .unique_charges = charges .astype (charge_dtype )
90+ self .charge_labels = charge_labels .astype (label_dtype )
8591
8692 @staticmethod
8793 def fuse (charge1 , charge2 ):
@@ -142,10 +148,15 @@ def charges(self):
142148 def dtype (self ):
143149 return self .unique_charges .dtype
144150
151+ @property
152+ def label_dtype (self ):
153+ return self .charge_labels .dtype
154+
145155 @property
146156 def degeneracies (self ):
147157 exp1 = self .charge_labels [:, None ]
148- exp2 = np .arange (self .unique_charges .shape [1 ], dtype = np .int16 )[None , :]
158+ exp2 = np .arange (
159+ self .unique_charges .shape [1 ], dtype = self .label_dtype )[None , :]
149160 return np .sum (exp1 == exp2 , axis = 0 )
150161
151162 def __repr__ (self ):
@@ -194,8 +205,8 @@ def identity_charges(self) -> "BaseCharge":
194205 """
195206 unique_charges = np .asarray (
196207 [ct .identity_charge () for ct in self .charge_types ],
197- dtype = np . int16 )[:, None ]
198- charge_labels = np .zeros (1 , dtype = np . int16 )
208+ dtype = self . dtype )[:, None ]
209+ charge_labels = np .zeros (1 , dtype = self . label_dtype )
199210 obj = self .__new__ (type (self ))
200211 obj .__init__ (unique_charges , charge_labels , self .charge_types )
201212 return obj
@@ -217,19 +228,19 @@ def __add__(self, other: "BaseCharge") -> "BaseCharge":
217228 other .charge_labels ) == 0 ):
218229 obj = self .__new__ (type (self ))
219230 obj .__init__ (
220- np .empty ((self .num_symmetries , 0 ), dtype = np . int16 ),
221- np .empty (0 , dtype = np . int16 ), self .charge_types )
231+ np .empty ((self .num_symmetries , 0 ), dtype = self . dtype ),
232+ np .empty (0 , dtype = self . label_dtype ), self .charge_types )
222233 return obj
223234 unique_charges , charge_labels = np .unique (
224235 comb_charges , return_inverse = True , axis = 1 )
225236 charge_labels = charge_labels .reshape (self .unique_charges .shape [1 ],
226237 other .unique_charges .shape [1 ]).astype (
227- np . int16 )
238+ self . label_dtype )
228239 # find new labels using broadcasting
229240 left_labels = self .charge_labels [:, None ] + np .zeros ([1 , len (other )],
230- dtype = np . int16 )
231- right_labels = other .charge_labels [None , :] + np .zeros ([ len ( self ), 1 ],
232- dtype = np . int16 )
241+ dtype = self . label_dtype )
242+ right_labels = other .charge_labels [None , :] + np .zeros (
243+ [ len ( self ), 1 ], dtype = self . label_dtype )
233244 charge_labels = charge_labels [np .ravel (left_labels ), np .ravel (right_labels )]
234245
235246 obj = self .__new__ (type (self ))
@@ -392,8 +403,9 @@ def unique(self,
392403 unique_charges = tmp_charge .unique_charges [:, tmp ]
393404 obj .__init__ (
394405 charges = unique_charges ,
395- charge_labels = np .arange (unique_charges .shape [1 ], dtype = np .int16 ),
396- charge_types = tmp_charge .charge_types )
406+ charge_labels = np .arange (
407+ unique_charges .shape [1 ], dtype = self .label_dtype ),
408+ charge_types = self .charge_types )
397409 out = [obj ]
398410 if return_index or return_inverse or return_counts :
399411 for n in range (1 , len (tmp )):
@@ -421,23 +433,24 @@ def reduce(self,
421433 of target values.
422434 """
423435 if isinstance (target_charges , (np .integer , int )):
424- target_charges = np .asarray ([target_charges ], dtype = np . int16 )
436+ target_charges = np .asarray ([target_charges ], dtype = self . dtype )
425437 if target_charges .ndim == 1 :
426438 target_charges = target_charges [None , :]
427- target_charges = np .asarray (target_charges , dtype = np . int16 )
439+ target_charges = np .asarray (target_charges , dtype = self . dtype )
428440 # find intersection of index charges and target charges
429441 reduced_charges , label_to_unique , _ = intersect (
430442 self .unique_charges , target_charges , axis = 1 , return_indices = True )
431443 num_unique = len (label_to_unique )
432444
433445 # construct the map to the reduced charges
434- map_to_reduced = np .full (self .dim , fill_value = - 1 , dtype = np .int16 )
435- map_to_reduced [label_to_unique ] = np .arange (num_unique , dtype = np .int16 )
446+ map_to_reduced = np .full (self .dim , fill_value = - 1 , dtype = self .label_dtype )
447+ map_to_reduced [label_to_unique ] = np .arange (
448+ num_unique , dtype = self .label_dtype )
436449
437450 # construct the map to the reduced charges
438451 reduced_ind_labels = map_to_reduced [self .charge_labels ]
439452 reduced_locs = reduced_ind_labels >= 0
440- new_ind_labels = reduced_ind_labels [reduced_locs ].astype (np . int16 )
453+ new_ind_labels = reduced_ind_labels [reduced_locs ].astype (self . label_dtype )
441454 obj = self .__new__ (type (self ))
442455 obj .__init__ (reduced_charges , new_ind_labels , self .charge_types )
443456
@@ -517,8 +530,13 @@ class U1Charge(BaseCharge):
517530 def __init__ (self ,
518531 charges : np .ndarray ,
519532 charge_labels : Optional [np .ndarray ] = None ,
520- charge_types : Optional [List [Type ["BaseCharge" ]]] = None ) -> None :
521- super ().__init__ (charges , charge_labels , charge_types = [type (self )])
533+ charge_types : Optional [List [Type ["BaseCharge" ]]] = None ,
534+ charge_dtype : Optional [Type [np .number ]] = np .int16 ) -> None :
535+ super ().__init__ (
536+ charges ,
537+ charge_labels ,
538+ charge_types = [type (self )],
539+ charge_dtype = charge_dtype )
522540
523541 @staticmethod
524542 def fuse (charge1 , charge2 ) -> np .ndarray :
0 commit comments