Skip to content

Commit 8a0e7af

Browse files
authored
Merge pull request #841 from digvijay-y/performance
Improve NumberedObjectCollection.check_number
2 parents 7412da7 + 167fd9d commit 8a0e7af

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

doc/source/changelog.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ MontePy Changelog
88
#Next Version#
99
--------------
1010

11+
**Performance Improvement**
12+
13+
* Optimized :math:`\mathcal{O}(N^2)` scaling in :func:`montepy.NumberedObjectCollection.request_number` by improving ``NumberedObjectCollection.check_number`` to :math:`\mathcal{O}(N)` (:issue:`786`).
1114

1215
**Features Added**
1316

montepy/numbered_object_collection.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,6 @@ def check_number(self, number):
244244
"""
245245
if not isinstance(number, Integral):
246246
raise TypeError("The number must be an int")
247-
248247
if number < 0:
249248
raise ValueError(f"The number must be non-negative. {number} given.")
250249
conflict = False
@@ -635,14 +634,16 @@ def request_number(self, start_num=None, step=None):
635634
If starting_number, or step are not specified :func:`starting_number`,
636635
and :func:`step` are used as default values.
637636
638-
639637
.. versionchanged:: 0.5.0
640638
In 0.5.0 the default values were changed to reference :func:`starting_number` and :func:`step`.
641639
640+
.. versionchanged:: 1.2.0
641+
start_num is now only a suggestion for the starting point. The returned number is not guaranteed to be start_num, but will be the next available number after start_num (or after the last assigned number).
642+
642643
Parameters
643644
----------
644645
start_num : int
645-
the starting number to check.
646+
Suggested starting number to check. Not guaranteed to be the returned value.
646647
step : int
647648
the increment to jump by to find new numbers.
648649
@@ -659,13 +660,21 @@ def request_number(self, start_num=None, step=None):
659660
start_num = self.starting_number
660661
if step is None:
661662
step = self.step
662-
number = start_num
663+
try:
664+
self.check_number(start_num)
665+
return start_num
666+
except NumberConflictError:
667+
pass
668+
# Increment to next available number. If not set use start_num as is
669+
last_assigned = getattr(self, "_last_assigned_number", start_num - step) + step
670+
number = max(start_num, last_assigned)
663671
while True:
664672
try:
665673
self.check_number(number)
666674
break
667675
except NumberConflictError:
668676
number += step
677+
self._last_assigned_number = number
669678
return number
670679

671680
def next_number(self, step=1):

0 commit comments

Comments
 (0)