L i{ dZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z d d l mZd dlmZe deZgdZ ddZ d ddZ ddZddZy)zTopological sorting algorithms.) annotations)Any) Collection) DefaultDict)Iterable)Iterator)Sequence)Set)Tuple)TypeVar)util)CircularDependencyError_T)bound)sortsort_as_subsets find_cyclesc#Ktjt}|D]\}}||j|t |}t|}|r~g}|D](}|j ||s|j |*|s tdt||t||j||D cgc] } | |vs|  }} ||r}yycc} ww)NzCircular dependency detected.) r defaultdictsetaddlist isdisjointappendrr _gen_edgesdifference_update) tuplesallitemsedgesparentchildtodotodo_setoutputnodets a/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sqlalchemy/util/topological.pyrrs'+&6&6s&;E!  e  ! >D8}H  $D""5;/ d# $)/FH-5!  ""6*1a1=11  2s%A+C.A C8 CCCCc#FKt||D] }|Ed{y7w)a,sort the given list of items by dependency. 'tuples' is a list of tuples representing a partial ordering. deterministic_order is no longer used, the order is now always deterministic given the order of "allitems". the flag is there for backwards compatibility with Alembic. N)r)rrdeterministic_orderset_s r(rr:s( 1s !!ctjt}|D]\}}||j|t|}t}|D]}|g}|j |} |s|d} || D]d}||vr6||j |d} | j | |j| || vsB|j|| j|n|j|r|S)N) rrrr differenceindexrupdaterremovepop) rrr r!r" nodes_to_testr%r&stackr#topcycs r(rrMs '+&6&6s&;E!  f % !JM UF''.)Cc 5= D 1 34C**3/MM#&4<LL&KK%  " McJ|Dchc]}||D]}||fc}}Scc}}w)N)r leftrights r(rrws*&+ Edt EUDM EM EE EsN)rCollection[Tuple[_T, _T]]rCollection[_T]returnzIterator[Sequence[_T]])T)rr<rr=r*boolr>z Iterator[_T])rzIterable[Tuple[_T, _T]]rz Iterable[_T]r>zSet[_T])r zDefaultDict[_T, Set[_T]]r>zSet[Tuple[_T, _T]])__doc__ __future__rtypingrrrrrr r r r rexcrr__all__rrrrr9r7r(rFs&") T 4 %1?>!% % &' #'/;' 'TFr7