diff env/lib/python3.7/site-packages/boltons/mathutils.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/boltons/mathutils.py	Thu May 14 16:47:39 2020 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-"""This module provides useful math functions on top of Python's
-built-in :mod:`math` module.
-"""
-from __future__ import division
-
-from math import ceil as _ceil, floor as _floor
-import bisect
-import binascii
-
-
-def clamp(x, lower=float('-inf'), upper=float('inf')):
-    """Limit a value to a given range.
-
-    Args:
-        x (int or float): Number to be clamped.
-        lower (int or float): Minimum value for x.
-        upper (int or float): Maximum value for x.
-
-    The returned value is guaranteed to be between *lower* and
-    *upper*. Integers, floats, and other comparable types can be
-    mixed.
-
-    >>> clamp(1.0, 0, 5)
-    1.0
-    >>> clamp(-1.0, 0, 5)
-    0
-    >>> clamp(101.0, 0, 5)
-    5
-    >>> clamp(123, upper=5)
-    5
-
-    Similar to `numpy's clip`_ function.
-
-    .. _numpy's clip: http://docs.scipy.org/doc/numpy/reference/generated/numpy.clip.html
-
-    """
-    if upper < lower:
-        raise ValueError('expected upper bound (%r) >= lower bound (%r)'
-                         % (upper, lower))
-    return min(max(x, lower), upper)
-
-
-def ceil(x, options=None):
-    """Return the ceiling of *x*. If *options* is set, return the smallest
-    integer or float from *options* that is greater than or equal to
-    *x*.
-
-    Args:
-        x (int or float): Number to be tested.
-        options (iterable): Optional iterable of arbitrary numbers
-          (ints or floats).
-
-    >>> VALID_CABLE_CSA = [1.5, 2.5, 4, 6, 10, 25, 35, 50]
-    >>> ceil(3.5, options=VALID_CABLE_CSA)
-    4
-    >>> ceil(4, options=VALID_CABLE_CSA)
-    4
-    """
-    if options is None:
-        return _ceil(x)
-    options = sorted(options)
-    i = bisect.bisect_left(options, x)
-    if i == len(options):
-        raise ValueError("no ceil options greater than or equal to: %r" % x)
-    return options[i]
-
-
-def floor(x, options=None):
-    """Return the floor of *x*. If *options* is set, return the largest
-    integer or float from *options* that is less than or equal to
-    *x*.
-
-    Args:
-        x (int or float): Number to be tested.
-        options (iterable): Optional iterable of arbitrary numbers
-          (ints or floats).
-
-    >>> VALID_CABLE_CSA = [1.5, 2.5, 4, 6, 10, 25, 35, 50]
-    >>> floor(3.5, options=VALID_CABLE_CSA)
-    2.5
-    >>> floor(2.5, options=VALID_CABLE_CSA)
-    2.5
-
-    """
-    if options is None:
-        return _floor(x)
-    options = sorted(options)
-
-    i = bisect.bisect_right(options, x)
-    if not i:
-        raise ValueError("no floor options less than or equal to: %r" % x)
-    return options[i - 1]
-
-
-try:
-    _int_types = (int, long)
-    bytes = str
-except NameError:
-    # py3 has no long
-    _int_types = (int,)
-    unicode = str
-
-
-class Bits(object):
-    '''
-    An immutable bit-string or bit-array object.
-    Provides list-like access to bits as bools,
-    as well as bitwise masking and shifting operators.
-    Bits also make it easy to convert between many
-    different useful representations:
-
-    * bytes -- good for serializing raw binary data
-    * int -- good for incrementing (e.g. to try all possible values)
-    * list of bools -- good for iterating over or treating as flags
-    * hex/bin string -- good for human readability
-
-    '''
-    __slots__ = ('val', 'len')
-
-    def __init__(self, val=0, len_=None):
-        if type(val) not in _int_types:
-            if type(val) is list:
-                val = ''.join(['1' if e else '0' for e in val])
-            if type(val) is bytes:
-                val = val.decode('ascii')
-            if type(val) is unicode:
-                if len_ is None:
-                    len_ = len(val)
-                    if val.startswith('0x'):
-                        len_ = (len_ - 2) * 4
-                if val.startswith('0x'):
-                    val = int(val, 16)
-                else:
-                    if val:
-                        val = int(val, 2)
-                    else:
-                        val = 0
-            if type(val) not in _int_types:
-                raise TypeError('initialized with bad type: {0}'.format(type(val).__name__))
-        if val < 0:
-            raise ValueError('Bits cannot represent negative values')
-        if len_ is None:
-            len_ = len('{0:b}'.format(val))
-        if val > 2 ** len_:
-            raise ValueError('value {0} cannot be represented with {1} bits'.format(val, len_))
-        self.val = val  # data is stored internally as integer
-        self.len = len_
-
-    def __getitem__(self, k):
-        if type(k) is slice:
-            return Bits(self.as_bin()[k])
-        if type(k) is int:
-            if k >= self.len:
-                raise IndexError(k)
-            return bool((1 << (self.len - k - 1)) & self.val)
-        raise TypeError(type(k))
-
-    def __len__(self):
-        return self.len
-
-    def __eq__(self, other):
-        if type(self) is not type(other):
-            return NotImplemented
-        return self.val == other.val and self.len == other.len
-
-    def __or__(self, other):
-        if type(self) is not type(other):
-            return NotImplemented
-        return Bits(self.val | other.val, max(self.len, other.len))
-
-    def __and__(self, other):
-        if type(self) is not type(other):
-            return NotImplemented
-        return Bits(self.val & other.val, max(self.len, other.len))
-
-    def __lshift__(self, other):
-        return Bits(self.val << other, self.len + other)
-
-    def __rshift__(self, other):
-        return Bits(self.val >> other, self.len - other)
-
-    def __hash__(self):
-        return hash(self.val)
-
-    def as_list(self):
-        return [c == '1' for c in '{0:b}'.format(self.val)]
-
-    def as_bin(self):
-        return '{{0:0{0}b}}'.format(self.len).format(self.val)
-
-    def as_hex(self):
-        # make template to pad out to number of bytes necessary to represent bits
-        tmpl = '%0{0}X'.format(2 * (self.len // 8 + ((self.len % 8) != 0)))
-        ret = tmpl % self.val
-        return ret
-
-    def as_int(self):
-        return self.val
-
-    def as_bytes(self):
-        return binascii.unhexlify(self.as_hex())
-
-    @classmethod
-    def from_list(cls, list_):
-        return cls(list_)
-
-    @classmethod
-    def from_bin(cls, bin):
-        return cls(bin)
-
-    @classmethod
-    def from_hex(cls, hex):
-        if isinstance(hex, bytes):
-            hex = hex.decode('ascii')
-        if not hex.startswith('0x'):
-            hex = '0x' + hex
-        return cls(hex)
-
-    @classmethod
-    def from_int(cls, int_, len_=None):
-        return cls(int_, len_)
-
-    @classmethod
-    def from_bytes(cls, bytes_):
-        return cls.from_hex(binascii.hexlify(bytes_))
-
-    def __repr__(self):
-        cn = self.__class__.__name__
-        return "{0}('{1}')".format(cn, self.as_bin())