|
2 | 2 | from ctypes import c_int, c_void_p, sizeof
|
3 | 3 | from itertools import groupby, product
|
4 | 4 | from math import ceil, pow
|
5 |
| -from sympy import primefactors |
| 5 | +from sympy import factorint |
6 | 6 |
|
7 | 7 | import atexit
|
8 | 8 |
|
@@ -634,16 +634,15 @@ def __new__(cls, items, input_comm):
|
634 | 634 | alloc_procs = np.prod([i for i in items if i != '*'])
|
635 | 635 | rem_procs = int(input_comm.size // alloc_procs)
|
636 | 636 |
|
637 |
| - # Start by using the max prime factor at the first starred position, |
638 |
| - # then iteratively decompose as evenly as possible until decomposing |
639 |
| - # to the number of `rem_procs` |
640 |
| - star_vals = [1] * len(items) |
641 |
| - star_i = 0 |
642 |
| - while rem_procs > 1: |
643 |
| - prime_factors = primefactors(rem_procs) |
644 |
| - rem_procs //= max(prime_factors) |
645 |
| - star_vals[star_i] *= max(prime_factors) |
646 |
| - star_i = (star_i + 1) % nstars |
| 637 | + # List of all factors of rem_procs in decreasing order |
| 638 | + factors = factorint(rem_procs) |
| 639 | + vals = [k for (k, v) in factors.items() for _ in range(v)][::-1] |
| 640 | + |
| 641 | + # Split in number of stars |
| 642 | + split = np.array_split(vals, nstars) |
| 643 | + |
| 644 | + # Reduce |
| 645 | + star_vals = [int(np.prod(s)) for s in split] |
647 | 646 |
|
648 | 647 | # Apply computed star values to the processed
|
649 | 648 | for index, value in zip(star_pos, star_vals):
|
|
0 commit comments