diff env/lib/python3.7/site-packages/networkx/utils/misc.py @ 5:9b1c78e6ba9c draft default tip

"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author shellac
date Mon, 01 Jun 2020 08:59:25 -0400
parents 79f47841a781
children
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/networkx/utils/misc.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,450 +0,0 @@
-"""
-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
-"""
-# Authors:      Aric Hagberg (hagberg@lanl.gov),
-#               Dan Schult(dschult@colgate.edu),
-#               Ben Edwards(bedwards@cs.unm.edu)
-
-#    Copyright (C) 2004-2019 by
-#    Aric Hagberg <hagberg@lanl.gov>
-#    Dan Schult <dschult@colgate.edu>
-#    Pieter Swart <swart@lanl.gov>
-#    All rights reserved.
-#    BSD license.
-from collections import defaultdict
-from collections import deque
-import warnings
-import sys
-import uuid
-from itertools import tee, chain
-import networkx as nx
-
-# itertools.accumulate is only available on Python 3.2 or later.
-#
-# Once support for Python versions less than 3.2 is dropped, this code should
-# be removed.
-try:
-    from itertools import accumulate
-except ImportError:
-    import operator
-
-    # The code for this function is from the Python 3.5 documentation,
-    # distributed under the PSF license:
-    # <https://docs.python.org/3.5/library/itertools.html#itertools.accumulate>
-    def accumulate(iterable, func=operator.add):
-        it = iter(iterable)
-        try:
-            total = next(it)
-        except StopIteration:
-            return
-        yield total
-        for element in it:
-            total = func(total, element)
-            yield total
-
-# 2.x/3.x compatibility
-try:
-    basestring
-except NameError:
-    basestring = str
-    unicode = str
-
-# some cookbook stuff
-# used in deciding whether something is a bunch of nodes, edges, etc.
-# see G.add_nodes and others in Graph Class in networkx/base.py
-
-
-def is_string_like(obj):  # from John Hunter, types-free version
-    """Check if obj is string."""
-    return isinstance(obj, basestring)
-
-
-def iterable(obj):
-    """ Return True if obj is iterable with a well-defined len()."""
-    if hasattr(obj, "__iter__"):
-        return True
-    try:
-        len(obj)
-    except:
-        return False
-    return True
-
-
-def flatten(obj, result=None):
-    """ Return flattened version of (possibly nested) iterable object. """
-    if not iterable(obj) or is_string_like(obj):
-        return obj
-    if result is None:
-        result = []
-    for item in obj:
-        if not iterable(item) or is_string_like(item):
-            result.append(item)
-        else:
-            flatten(item, result)
-    return obj.__class__(result)
-
-
-def make_list_of_ints(sequence):
-    """Return list of ints from sequence of integral numbers.
-    
-    All elements of the sequence must satisfy int(element) == element
-    or a ValueError is raised. Sequence is iterated through once.
-
-    If sequence is a list, the non-int values are replaced with ints.
-    So, no new list is created
-    """
-    msg = 'sequence is not all integers: %s'
-    if not isinstance(sequence, list):
-        result = []
-        for i in sequence:
-            try:
-                ii = int(i)
-            except ValueError:
-                raise nx.NetworkXError(msg % i) from None
-            if ii != i:
-                raise nx.NetworkXError(msg % i)
-            result.append(ii)
-        return result
-    # original sequence is a list... in-place conversion to ints
-    for indx, i in enumerate(sequence):
-        if isinstance(i, int):
-            continue
-        try:
-            ii = int(i)
-        except ValueError:
-            raise nx.NetworkXError(msg % i) from None
-        if ii != i:
-            raise nx.NetworkXError(msg % i)
-        sequence[indx] = ii
-    return sequence
-
-
-def is_list_of_ints(intlist):
-    """ Return True if list is a list of ints. """
-    if not isinstance(intlist, list):
-        return False
-    for i in intlist:
-        if not isinstance(i, int):
-            return False
-    return True
-
-
-PY2 = sys.version_info[0] == 2
-if PY2:
-    def make_str(x):
-        """Returns the string representation of t."""
-        if isinstance(x, unicode):
-            return x
-        else:
-            # Note, this will not work unless x is ascii-encoded.
-            # That is good, since we should be working with unicode anyway.
-            # Essentially, unless we are reading a file, we demand that users
-            # convert any encoded strings to unicode before using the library.
-            #
-            # Also, the str() is necessary to convert integers, etc.
-            # unicode(3) works, but unicode(3, 'unicode-escape') wants a buffer
-            #
-            return unicode(str(x), 'unicode-escape')
-else:
-    def make_str(x):
-        """Returns the string representation of t."""
-        return str(x)
-
-
-def generate_unique_node():
-    """ Generate a unique node label."""
-    return str(uuid.uuid1())
-
-
-def default_opener(filename):
-    """Opens `filename` using system's default program.
-
-    Parameters
-    ----------
-    filename : str
-        The path of the file to be opened.
-
-    """
-    from subprocess import call
-
-    cmds = {'darwin': ['open'],
-            'linux': ['xdg-open'],
-            'linux2': ['xdg-open'],
-            'win32': ['cmd.exe', '/C', 'start', '']}
-    cmd = cmds[sys.platform] + [filename]
-    call(cmd)
-
-
-def dict_to_numpy_array(d, mapping=None):
-    """Convert a dictionary of dictionaries to a numpy array
-    with optional mapping."""
-    try:
-        return dict_to_numpy_array2(d, mapping)
-    except (AttributeError, TypeError):
-        # AttributeError is when no mapping was provided and v.keys() fails.
-        # TypeError is when a mapping was provided and d[k1][k2] fails.
-        return dict_to_numpy_array1(d, mapping)
-
-
-def dict_to_numpy_array2(d, mapping=None):
-    """Convert a dictionary of dictionaries to a 2d numpy array
-    with optional mapping.
-
-    """
-    import numpy
-    if mapping is None:
-        s = set(d.keys())
-        for k, v in d.items():
-            s.update(v.keys())
-        mapping = dict(zip(s, range(len(s))))
-    n = len(mapping)
-    a = numpy.zeros((n, n))
-    for k1, i in mapping.items():
-        for k2, j in mapping.items():
-            try:
-                a[i, j] = d[k1][k2]
-            except KeyError:
-                pass
-    return a
-
-
-def dict_to_numpy_array1(d, mapping=None):
-    """Convert a dictionary of numbers to a 1d numpy array
-    with optional mapping.
-
-    """
-    import numpy
-    if mapping is None:
-        s = set(d.keys())
-        mapping = dict(zip(s, range(len(s))))
-    n = len(mapping)
-    a = numpy.zeros(n)
-    for k1, i in mapping.items():
-        i = mapping[k1]
-        a[i] = d[k1]
-    return a
-
-
-def is_iterator(obj):
-    """Returns True if and only if the given object is an iterator
-    object.
-
-    """
-    has_next_attr = hasattr(obj, '__next__') or hasattr(obj, 'next')
-    return iter(obj) is obj and has_next_attr
-
-
-def arbitrary_element(iterable):
-    """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
-
-    """
-    if is_iterator(iterable):
-        raise ValueError('cannot return an arbitrary item from an iterator')
-    # Another possible implementation is ``for x in iterable: return x``.
-    return next(iter(iterable))
-
-
-# Recipe from the itertools documentation.
-def consume(iterator):
-    "Consume the iterator entirely."
-    # Feed the entire iterator into a zero-length deque.
-    deque(iterator, maxlen=0)
-
-
-# Recipe from the itertools documentation.
-def pairwise(iterable, cyclic=False):
-    "s -> (s0, s1), (s1, s2), (s2, s3), ..."
-    a, b = tee(iterable)
-    first = next(b, None)
-    if cyclic is True:
-        return zip(a, chain(b, (first,)))
-    return zip(a, b)
-
-
-def groups(many_to_one):
-    """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'}}
-
-    """
-    one_to_many = defaultdict(set)
-    for v, k in many_to_one.items():
-        one_to_many[k].add(v)
-    return dict(one_to_many)
-
-
-def to_tuple(x):
-    """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))
-
-    """
-    if not isinstance(x, (tuple, list)):
-        return x
-    return tuple(map(to_tuple, x))
-
-
-def create_random_state(random_state=None):
-    """Returns a numpy.random.RandomState instance depending on input.
-
-    Parameters
-    ----------
-    random_state : int or RandomState instance or None  optional (default=None)
-        If int, return a numpy.random.RandomState instance set with seed=int.
-        if numpy.random.RandomState instance, return it.
-        if None or numpy.random, return the global random number generator used
-        by numpy.random.
-    """
-    import numpy as np
-
-    if random_state is None or random_state is np.random:
-        return np.random.mtrand._rand
-    if isinstance(random_state, np.random.RandomState):
-        return random_state
-    if isinstance(random_state, int):
-        return np.random.RandomState(random_state)
-    msg = '%r cannot be used to generate a numpy.random.RandomState instance'
-    raise ValueError(msg % random_state)
-
-
-class PythonRandomInterface(object):
-    try:
-        def __init__(self, rng=None):
-            import numpy
-            if rng is None:
-                self._rng = numpy.random.mtrand._rand
-            self._rng = rng
-    except ImportError:
-        msg = 'numpy not found, only random.random available.'
-        warnings.warn(msg, ImportWarning)
-
-    def random(self):
-        return self._rng.random_sample()
-
-    def uniform(self, a, b):
-        return a + (b - a) * self._rng.random_sample()
-
-    def randrange(self, a, b=None):
-        return self._rng.randint(a, b)
-
-    def choice(self, seq):
-        return seq[self._rng.randint(0, len(seq))]
-
-    def gauss(self, mu, sigma):
-        return self._rng.normal(mu, sigma)
-
-    def shuffle(self, seq):
-        return self._rng.shuffle(seq)
-
-#    Some methods don't match API for numpy RandomState.
-#    Commented out versions are not used by NetworkX
-
-    def sample(self, seq, k):
-        return self._rng.choice(list(seq), size=(k,), replace=False)
-
-    def randint(self, a, b):
-        return self._rng.randint(a, b + 1)
-
-#    exponential as expovariate with 1/argument,
-    def expovariate(self, scale):
-        return self._rng.exponential(1/scale)
-
-#    pareto as paretovariate with 1/argument,
-    def paretovariate(self, shape):
-        return self._rng.pareto(shape)
-
-#    weibull as weibullvariate multiplied by beta,
-#    def weibullvariate(self, alpha, beta):
-#        return self._rng.weibull(alpha) * beta
-#
-#    def triangular(self, low, high, mode):
-#        return self._rng.triangular(low, mode, high)
-#
-#    def choices(self, seq, weights=None, cum_weights=None, k=1):
-#        return self._rng.choice(seq
-
-
-def create_py_random_state(random_state=None):
-    """Returns a random.Random instance depending on input.
-
-    Parameters
-    ----------
-    random_state : int or random number generator or None (default=None)
-        If int, return a random.Random instance set with seed=int.
-        if random.Random instance, return it.
-        if None or the `random` package, return the global random number
-        generator used by `random`.
-        if np.random package, return the global numpy random number
-        generator wrapped in a PythonRandomInterface class.
-        if np.random.RandomState instance, return it wrapped in
-        PythonRandomInterface
-        if a PythonRandomInterface instance, return it
-    """
-    import random
-    try:
-        import numpy as np
-        if random_state is np.random:
-            return PythonRandomInterface(np.random.mtrand._rand)
-        if isinstance(random_state, np.random.RandomState):
-            return PythonRandomInterface(random_state)
-        if isinstance(random_state, PythonRandomInterface):
-            return random_state
-        has_numpy = True
-    except ImportError:
-        has_numpy = False
-
-    if random_state is None or random_state is random:
-        return random._inst
-    if isinstance(random_state, random.Random):
-        return random_state
-    if isinstance(random_state, int):
-        return random.Random(random_state)
-    msg = '%r cannot be used to generate a random.Random instance'
-    raise ValueError(msg % random_state)
-
-
-# fixture for pytest
-def setup_module(module):
-    import pytest
-    numpy = pytest.importorskip('numpy')