ó ŸĂŇYc@s‡dZddlmZddlmZddlZddlZddlmZmZyddlm Z Wn,e k r–ddl Z e j d„Z nXye Wnek ržeZ eZnXd„Zd „Zdd „Zd „Zejd d kZer d„Zn d„Zd„Zd„Zdd„Zdd„Zdd„Zd„Zd„Zd„Z e!d„Z"d„Z#d„Z$dS(sÇ Miscellaneous Helpers for NetworkX. These are not imported into the base networkx namespace but can be accessed, for example, as >>> import networkx >>> networkx.utils.is_string_like('spam') True i˙˙˙˙(t defaultdict(tdequeN(tteetchain(t accumulateccs_t|ƒ}yt|ƒ}Wntk r0dSX|Vx"|D]}|||ƒ}|Vq=WdS(N(titertnextt StopIteration(titerabletfunctitttotaltelement((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyR's   cCs t|tƒS(sCheck if obj is string.(t isinstancet basestring(tobj((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytis_string_like>scCs0t|dƒrtSyt|ƒWntSXtS(s: Return True if obj is iterable with a well-defined len().t__iter__(thasattrtTruetlentFalse(R((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyRCscCs†t|ƒ st|ƒr|S|dkr2g}nxD|D]<}t|ƒ sXt|ƒrh|j|ƒq9t||ƒq9W|j|ƒS(s@ Return flattened version of (possibly nested) iterable object. N(RRtNonetappendtflattent __class__(Rtresulttitem((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyRNs   cCs;t|tƒstSx!|D]}t|tƒstSqWtS(s( Return True if list is a list of ints. (R tlistRtintR(tintlistti((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytis_list_of_ints\s  iicCs*t|tƒr|Stt|ƒdƒSdS(s&Return the string representation of t.sunicode-escapeN(R tunicodetstr(tx((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytmake_strhs cCs t|ƒS(s&Return the string representation of t.(R"(R#((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyR$wscCsttjƒƒS(s Generate a unique node label.(R"tuuidtuuid1(((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytgenerate_unique_node|scCsiddlm}idgd6dgd6dgd6dd d d gd 6}|tj|g}||ƒd S(s“Opens `filename` using system's default program. Parameters ---------- filename : str The path of the file to be opened. i˙˙˙˙(tcalltopentdarwinsxdg-opentlinuxtlinux2scmd.exes/Ctstartttwin32N(t subprocessR(tsystplatform(tfilenameR(tcmdstcmd((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytdefault_openers    cCs9yt||ƒSWn!ttfk r4t||ƒSXdS(sPConvert a dictionary of dictionaries to a numpy array with optional mapping.N(tdict_to_numpy_array2tAttributeErrort TypeErrortdict_to_numpy_array1(tdtmapping((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytdict_to_numpy_array”sc Cs ddl}|dkr~t|jƒƒ}x-|jƒD]\}}|j|jƒƒq7Wtt|tt |ƒƒƒƒ}nt |ƒ}|j ||fƒ}xg|jƒD]Y\}} xJ|jƒD]<\} } y||| || | ftstktvtntatk1Rtk2tj((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyR7Ÿs  $   cCs˘ddl}|dkrNt|jƒƒ}tt|tt|ƒƒƒƒ}nt|ƒ}|j|ƒ}x2|j ƒD]$\}}||}||||RR?R@RCRDRERRFRA(R;R<R>RHRKRLRMR((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyR:ľs  $  cCs4t|dƒpt|dƒ}t|ƒ|ko3|S(sMReturns True if and only if the given object is an iterator object. t__next__R(RR(Rt has_next_attr((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyt is_iteratorĆscCs+t|ƒrtdƒ‚ntt|ƒƒS(sšReturns an arbitrary element of `iterable` without removing it. This is most useful for "peeking" at an arbitrary element of a set, but can be used for any list, dictionary, etc., as well:: >>> arbitrary_element({3, 2, 1}) 1 >>> arbitrary_element('hello') 'h' This function raises a :exc:`ValueError` if `iterable` is an iterator (because the current implementation of this function would consume an element from the iterator):: >>> iterator = iter([1, 2, 3]) >>> arbitrary_element(iterator) Traceback (most recent call last): ... ValueError: cannot return an arbitrary item from an iterator s0cannot return an arbitrary item from an iterator(RRt ValueErrorRR(R((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytarbitrary_elementĎs cCst|ddƒdS(sConsume the iterator entirely.tmaxleniN(R(titerator((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytconsumeěscCsSt|ƒ\}}t|dƒ}|tkrFt|t||fƒƒSt||ƒS(s&s -> (s0, s1), (s1, s2), (s2, s3), ...N(RRRRRDR(RtcyclicRLtbtfirst((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytpairwiseós  cCsDttƒ}x+|jƒD]\}}||j|ƒqWt|ƒS(s Converts a many-to-one mapping into a one-to-many mapping. `many_to_one` must be a dictionary whose keys and values are all :term:`hashable`. The return value is a dictionary mapping values from `many_to_one` to sets of keys from `many_to_one` that have that value. For example:: >>> from networkx.utils import groups >>> many_to_one = {'a': 1, 'b': 1, 'c': 2, 'd': 3, 'e': 3} >>> groups(many_to_one) # doctest: +SKIP {1: {'a', 'b'}, 2: {'c'}, 3: {'d', 'e'}} (RR?RAtaddRC(t many_to_onet one_to_manyRJRI((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pytgroupsüs cCs,t|ttfƒs|Sttt|ƒƒS(sťConverts lists to tuples. For example:: >>> from networkx.utils import to_tuple >>> a_list = [1, 2, [1, 4]] >>> to_tuple(a_list) (1, 2, (1, 4)) (R ttupleRtmaptto_tuple(R#((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyRbs (%t__doc__t collectionsRRR1R%t itertoolsRRRt ImportErrortoperatorR\Rt NameErrorR"R!RRRRR t version_infotPY2R$R'R6R=R7R:RRRTRWRR[R_Rb(((si/private/var/folders/w6/vb91730s7bb1k90y_rnhql1dhvdd44/T/pip-build-w4MwvS/networkx/networkx/utils/misc.pyt sD