2222import apportionment .methods as apportion
2323import numpy as np
2424import pandas as pd
25- from numpy .random import Generator
2625
2726from votekit .ballot import RankBallot
2827from votekit .ballot_generator .bloc_slate_generator .config import BlocSlateConfig
@@ -147,7 +146,7 @@ def _check_name_bt_memory(config: BlocSlateConfig) -> None:
147146
148147
149148def _inner_name_bradley_terry (
150- config : BlocSlateConfig , random_seed : Optional [int ] = None
149+ config : BlocSlateConfig , * , rng : Optional [random . Random ] = None
151150) -> dict [str , RankProfile ]:
152151 """
153152 Sample from the BT distribution using direct sampling.
@@ -159,8 +158,9 @@ def _inner_name_bradley_terry(
159158 Args:
160159 config (BlocSlateConfig): Configuration object containing all necessary parameters for
161160 working with a bloc-slate ballot generator.
162- random_seed (int | None): Seed for RNG, allows for reproducible results given the same
163- inputs. Seed set to None by default, different results will be generated each time.
161+ rng (random.Random | None): Random Number Generator, allows for reproducible results given
162+ the same inputs. RNG set to None by default, different results will be generated each
163+ time.
164164
165165 Returns:
166166 dict[str, RankProfile]: Generated preference profiles by bloc.
@@ -183,7 +183,7 @@ def _inner_name_bradley_terry(
183183 pp_by_bloc = {b : RankProfile () for b in bloc_lst }
184184
185185 pref_interval_by_bloc_dict = config .get_combined_preference_intervals_by_bloc ()
186- rng = np . random .default_rng ( seed = random_seed )
186+ rng = random .Random () if rng is None else rng
187187
188188 for bloc in config .bloc_proportions .keys ():
189189 n_ballots = ballots_per_bloc [bloc ]
@@ -197,10 +197,10 @@ def _inner_name_bradley_terry(
197197
198198 # The return of this will be a numpy array, so we don't need to make it into a list
199199 sampled_indices = np .array (
200- rng .choice (
201- a = len (rankings ),
202- size = n_ballots ,
203- p = probs ,
200+ rng .choices (
201+ range ( len (rankings ) ),
202+ k = n_ballots ,
203+ weights = probs ,
204204 ),
205205 ndmin = 1 ,
206206 )
@@ -241,7 +241,7 @@ def _bradley_terry_mcmc(
241241 burn_in_time : int = 0 ,
242242 chain_length : Optional [int ] = None ,
243243 * ,
244- rng : Optional [Generator ] = None ,
244+ rng : Optional [random . Random ] = None ,
245245):
246246 """
247247 Sample from BT distribution for a given preference interval using MCMC. Defaults
@@ -258,8 +258,9 @@ def _bradley_terry_mcmc(
258258 chain_length//n_ballots steps from the chain until the desired number of ballots is
259259 reached. Defaults to None which sets the chain_length to the number of ballots in
260260 the config.
261- rng (Generator | None): Random Number Generator seeded with a known value for reproducible
262- results. By default, seeded with None to generate different results each time.
261+ rng (random.Random | None): Random Number Generator seeded with a known value for
262+ reproducible results. By default, seeded with None to generate different results each
263+ time.
263264 """
264265
265266 if chain_length is None :
@@ -280,9 +281,9 @@ def _bradley_terry_mcmc(
280281 burn_in_time = burn_in_time # int(10e5)
281282 if verbose :
282283 print (f"Burn in time: { burn_in_time } " )
283- rng = np . random .default_rng ( rng )
284+ rng = random .Random () if rng is None else rng
284285 swap_indices = [
285- (j1 , j1 + 1 ) for j1 in rng .choice ( n_candidates - 1 , size = n_ballots + burn_in_time )
286+ (j1 , j1 + 1 ) for j1 in rng .choices ( range ( n_candidates - 1 ), k = n_ballots + burn_in_time )
286287 ]
287288
288289 for i in range (burn_in_time ):
@@ -356,7 +357,7 @@ def _inner_name_bradley_terry_mcmc(
356357 verbose : bool = False ,
357358 burn_in_time : int = 0 ,
358359 chain_length : Optional [int ] = None ,
359- random_seed : Optional [int ] = None ,
360+ rng : Optional [random . Random ] = None ,
360361) -> dict [str , RankProfile ]:
361362 """
362363 Sample from the BT distribution using Markov Chain Monte Carlo.
@@ -372,8 +373,9 @@ def _inner_name_bradley_terry_mcmc(
372373 chain_length//n_ballots steps from the chain until the desired number of ballots is
373374 reached. Defaults to None which sets the chain_length to the number of ballots in
374375 the config.
375- random_seed (int | None): Seed for RNG, allows for reproducible results given the same
376- inputs. Seed set to None by default, different results will be generated each time.
376+ rng (Generator | None): Seed for Random Number Generator, allows for reproducible results
377+ given the same inputs. RNG set to None by default, different results will be generated
378+ each time.
377379
378380 Returns:
379381 Union[RankProfile, Tuple]
@@ -393,7 +395,7 @@ def _inner_name_bradley_terry_mcmc(
393395
394396 pp_by_bloc = {b : RankProfile () for b in bloc_lst }
395397 pref_interval_by_bloc_dict = config .get_combined_preference_intervals_by_bloc ()
396- rng = np . random .default_rng ( seed = random_seed )
398+ rng = random .Random () if rng is None else rng
397399
398400 for bloc in bloc_lst :
399401 n_ballots = ballots_per_bloc [bloc ]
@@ -448,7 +450,8 @@ def name_bt_profiles_by_bloc_generator(
448450 """
449451 _check_name_bt_memory (config )
450452 config .is_valid (raise_errors = True )
451- pp_by_bloc = _inner_name_bradley_terry (config , random_seed = random_seed )
453+ rng = random .Random (random_seed )
454+ pp_by_bloc = _inner_name_bradley_terry (config , rng = rng )
452455 if group_ballots :
453456 for bloc in pp_by_bloc :
454457 pp_by_bloc [bloc ] = pp_by_bloc [bloc ].group_ballots ()
@@ -480,7 +483,8 @@ def name_bt_profile_generator(
480483 """
481484 _check_name_bt_memory (config )
482485 config .is_valid (raise_errors = True )
483- pp_by_bloc = _inner_name_bradley_terry (config , random_seed = random_seed )
486+ rng = random .Random (random_seed )
487+ pp_by_bloc = _inner_name_bradley_terry (config , rng = rng )
484488
485489 # combine the profiles
486490 pp = RankProfile ()
@@ -525,12 +529,13 @@ def name_bt_profile_generator_using_mcmc(
525529 RankProfile: Generated preference profile.
526530 """
527531 config .is_valid (raise_errors = True )
532+ rng = random .Random (random_seed )
528533 pp_by_bloc = _inner_name_bradley_terry_mcmc (
529534 config ,
530535 verbose = verbose ,
531536 burn_in_time = burn_in_time ,
532537 chain_length = chain_length ,
533- random_seed = random_seed ,
538+ rng = rng ,
534539 )
535540 # combine the profiles
536541 pp = RankProfile ()
@@ -576,12 +581,13 @@ def name_bt_profiles_by_bloc_generator_using_mcmc(
576581 dict[str, RankProfile]: Generated preference profiles by bloc.
577582 """
578583 config .is_valid (raise_errors = True )
584+ rng = random .Random (random_seed )
579585 pp_by_bloc = _inner_name_bradley_terry_mcmc (
580586 config ,
581587 verbose = verbose ,
582588 burn_in_time = burn_in_time ,
583589 chain_length = chain_length ,
584- random_seed = random_seed ,
590+ rng = rng ,
585591 )
586592
587593 if group_ballots :
0 commit comments