Skip to content

Commit 7e8794a

Browse files
committed
Drop custom ordered set in favor of orderedsets
1 parent a9290d3 commit 7e8794a

3 files changed

Lines changed: 6 additions & 95 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies = [
3636
"pytools>=2024.1",
3737
"pymbolic>=2024.2",
3838
"sympy>=0.7.2",
39+
"orderedsets",
3940
]
4041

4142
[dependency-groups]

sumpy/cse.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ def match_common_args(func_class, funcs, opt_subs):
318318

319319
changed = set()
320320

321-
from sumpy.tools import OrderedSet
321+
from orderedsets import OrderedSet
322322

323323
for i in range(len(funcs)):
324324
common_arg_candidates_counts = arg_tracker.get_common_arg_candidates(
@@ -331,7 +331,7 @@ def match_common_args(func_class, funcs, opt_subs):
331331
key=lambda k: (common_arg_candidates_counts[k], k)))
332332

333333
while common_arg_candidates:
334-
j = common_arg_candidates.pop(last=False)
334+
j = common_arg_candidates.pop()
335335

336336
com_args = arg_tracker.func_to_argset[i].intersection(
337337
arg_tracker.func_to_argset[j])
@@ -391,7 +391,7 @@ def opt_cse(exprs: Sequence[sym.Basic]) -> dict[sym.Basic, sym.Basic | Unevaluat
391391
"""
392392
opt_subs: dict[sym.Basic, sym.Basic | Unevaluated] = {}
393393

394-
from sumpy.tools import OrderedSet
394+
from orderedsets import OrderedSet
395395
adds: OrderedSet[sym.Add] = OrderedSet()
396396
muls: OrderedSet[sym.Mul] = OrderedSet()
397397

sumpy/tools.py

Lines changed: 2 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,16 @@
3131
import logging
3232
import warnings
3333
from abc import ABC, abstractmethod
34-
from collections.abc import Hashable, Iterable, Iterator, Sequence, Set as AbstractSet
34+
from collections.abc import Hashable, Sequence, Set as AbstractSet
3535
from dataclasses import dataclass
3636
from typing import TYPE_CHECKING, Any, TypeAlias, cast
3737

3838
import numpy as np
39-
from typing_extensions import override
4039

4140
import loopy as lp
4241
from pymbolic.mapper.dependency import DependencyMapper
4342
from pyopencl.characterize import get_pocl_version
44-
from pytools import T, memoize_method
43+
from pytools import memoize_method
4544
from pytools.tag import Tag, tag_dataclass
4645

4746
import sumpy.symbolic as sym
@@ -71,7 +70,6 @@
7170
7271
.. autofunction:: to_complex_dtype
7372
.. autofunction:: is_obj_array_like
74-
.. autoclass:: OrderedSet
7573
7674
Multi-index Helpers
7775
-------------------
@@ -368,94 +366,6 @@ def get_kernel(self) -> lp.TranslationUnit:
368366
# }}}
369367

370368

371-
# {{{ OrderedSet
372-
373-
# Source: https://code.activestate.com/recipes/576694-orderedset/
374-
# Author: Raymond Hettinger
375-
# License: MIT
376-
377-
from collections.abc import MutableSet
378-
379-
380-
Link: TypeAlias = "list[Any]"
381-
382-
383-
class OrderedSet(MutableSet[T]):
384-
end: Link
385-
map: dict[T, Link]
386-
387-
def __init__(self, iterable: Iterable[T] | None = None) -> None:
388-
self.end = end = []
389-
end += [None, end, end] # sentinel node for doubly linked list
390-
self.map = {} # key --> [key, prev, next]
391-
392-
if iterable is not None:
393-
self |= iterable
394-
395-
@override
396-
def __len__(self) -> int:
397-
return len(self.map)
398-
399-
@override
400-
def __contains__(self, key: object) -> bool:
401-
return key in self.map
402-
403-
@override
404-
def add(self, value: T) -> None:
405-
if value not in self.map:
406-
end = self.end
407-
curr = end[1]
408-
curr[2] = end[1] = self.map[value] = [value, curr, end]
409-
410-
@override
411-
def discard(self, value: T) -> None:
412-
if value in self.map:
413-
_key, prev, next = self.map.pop(value)
414-
prev[2] = next
415-
next[1] = prev
416-
417-
@override
418-
def __iter__(self) -> Iterator[T]:
419-
end = self.end
420-
curr = end[2]
421-
while curr is not end:
422-
yield curr[0]
423-
curr = curr[2]
424-
425-
def __reversed__(self) -> Iterator[T]:
426-
end = self.end
427-
curr = end[1]
428-
while curr is not end:
429-
yield curr[0]
430-
curr = curr[1]
431-
432-
@override
433-
def pop(self, last: bool = True) -> T:
434-
if not self:
435-
raise KeyError("set is empty")
436-
437-
key = self.end[1][0] if last else self.end[2][0]
438-
self.discard(key)
439-
440-
return key
441-
442-
@override
443-
def __repr__(self) -> str:
444-
if not self:
445-
return f"{self.__class__.__name__}()"
446-
447-
return f"{self.__class__.__name__}({list(self)!r})"
448-
449-
@override
450-
def __eq__(self, other: object) -> bool:
451-
if isinstance(other, OrderedSet):
452-
return len(self) == len(other) and list(self) == list(other)
453-
454-
return set(self) == set(other)
455-
456-
# }}}
457-
458-
459369
class KernelCacheMixin(ABC):
460370
name: str
461371

0 commit comments

Comments
 (0)